用户组 
易积分722
热心0
好评1
|
作者:随缘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[variants.length];
- for (int i = 0; i < variants.length; i++) {
- Variant variant = variants[i];
- switch (variant.getType()) {
- case 1:
- objects[i] = variant.getBoolean();
- break;
- case 2:
- objects[i] = variant.getByte();
- break;
- case 3:
- objects[i] = variant.getShort();
- break;
- case 4:
- objects[i] = variant.getInteger();
- break;
- case 5:
- objects[i] = variant.getLong();
- break;
- case 6:
- objects[i] = variant.getSingle();
- break;
- case 7:
- objects[i] = variant.getDouble();
- break;
- case 8:
- objects[i] = variant.getString();
- break;
- case 9:
- objects[i] = variant.getObject();
- break;
- case 10:
- objects[i] = variant.getArray();
- break;
- case 11:
- objects[i] = variant.getDate();
- break;
- default:
- objects[i] = null;
- break;
- }
- }
- return objects;
- }
- }
- @Override
- public void 发生错误(long 线程ID, String err) {
- EventDispatcher.dispatchEvent(this, "发生错误", 线程ID, err);
- }
- }
复制代码
|
|
|