suiyuan 发表于 2022-9-29 08:01:30

随缘_多线线程操作开源代码


作者:随缘QQ:874334395
QQ群:476412098

package com.e4a.runtime.components.impl.android.随缘_多线程类库;

import android.os.Handler;
import android.os.Looper;
import com.e4a.runtime.components.ComponentContainer;
import com.e4a.runtime.components.impl.ComponentImpl;
import com.e4a.runtime.events.EventDispatcher;
import com.e4a.runtime.variants.Variant;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class 随缘_多线程Impl extends ComponentImpl implements 随缘_多线程 {
    public final static Map<ComponentContainer, List<Method>> COMPONENT_LIST_MAP = new HashMap<>();
    private ComponentContainer container;
    private Handler handler;

    public 随缘_多线程Impl(ComponentContainer container) {
      super(container);
      this.container = container;
      List<Method> methodList = COMPONENT_LIST_MAP.get(container);
      if (methodList == null) {
            methodList = new ArrayList<>();
            for (Method method : container.getClass().getMethods()) {
                if (method.getReturnType().equals(Void.TYPE)) {
                  methodList.add(method);
                }
            }
            COMPONENT_LIST_MAP.put(container, methodList);
      }
      handler = new Handler(Looper.getMainLooper());
    }

    @Override
    public long 启动线程(String 欲被调用的窗口过程名, Variant[] 欲投递的参数) {
      final long id = System.currentTimeMillis();
      new Thread() {
            @Override
            public void run() {
                try {
                  getMethod(欲被调用的窗口过程名).invoke(container, getPostingParameters(欲投递的参数));
                } catch (Throwable e) {
                  e.printStackTrace();
                  handler.post(() -> 发生错误(id, e.getMessage()));
                }
            }
      }.start();
      return id;
    }

    @Override
    public void post主线程(String 欲被调用的窗口过程名, Variant[] 欲投递的参数) {
      handler.post(() -> {
            try {
                getMethod(欲被调用的窗口过程名).invoke(container, getPostingParameters(欲投递的参数));
            } catch (Throwable e) {
                e.printStackTrace();
            }
      });
    }

    private Method getMethod(String methodName) throws NullPointerException {
      List<Method> methodList = COMPONENT_LIST_MAP.get(container);
      for (Method method : methodList) {
            if (method.getName().equals(methodName.trim())) {
                return method;
            }
      }
      throw new NullPointerException(String.format("在窗口下找不到_方法名:'%s' ", methodName));
    }

    private Object[] getPostingParameters(Variant[] variants) {
      if (variants == null || variants.length == 0) {
            return new Object[]{};
      } else {
            Object[] objects = new Object;
            for (int i = 0; i < variants.length; i++) {
                Variant variant = variants;
                switch (variant.getType()) {
                  case 1:
                        objects = variant.getBoolean();
                        break;
                  case 2:
                        objects = variant.getByte();
                        break;
                  case 3:
                        objects = variant.getShort();
                        break;
                  case 4:
                        objects = variant.getInteger();
                        break;
                  case 5:
                        objects = variant.getLong();
                        break;
                  case 6:
                        objects = variant.getSingle();
                        break;
                  case 7:
                        objects = variant.getDouble();
                        break;
                  case 8:
                        objects = variant.getString();
                        break;
                  case 9:
                        objects = variant.getObject();
                        break;
                  case 10:
                        objects = variant.getArray();
                        break;
                  case 11:
                        objects = variant.getDate();
                        break;
                  default:
                        objects = null;
                        break;

                }
            }
            return objects;
      }

    }

    @Override
    public void 发生错误(long 线程ID, String err) {
      EventDispatcher.dispatchEvent(this, "发生错误", 线程ID, err);
    }
}



czwy888 发表于 2022-9-29 08:26:10

MEILUANYOOONG

suiyuan 发表于 2022-9-29 14:37:10

czwy888 发表于 2022-9-29 08:26
MEILUANYOOONG

关键你这货色能看懂不。

pt1314 发表于 2022-9-30 11:05:28

要能看懂这个个.我也就不学E4A啦{:4_108:}

美丽新世界 发表于 2022-10-2 06:17:10

没有例程,没用

慕宇 发表于 2022-10-2 11:26:30

{:4_86:}

leiwawa 发表于 2022-10-18 08:33:43

谢谢分享。
页: [1]
查看完整版本: 随缘_多线线程操作开源代码