//这个注解用了方法回调 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Subscriber { String tag() default ""; int threadMode() default ThreadMode.MAIN; }
public class ThreadMode { public final static int MAIN = 1; public final static int CREATE_THREAD = 2; public final static int NOT_MAIN = 3; }
/** * Created by Administrator on 2016/10/10. */ public class EventBus { private static List<Object> datas = new LinkedList<>(); private ExecutorService singleThread = Executors.newSingleThreadExecutor(); public static EventBus instance; private EventBus() { } public static EventBus getDefault() { if (instance != null) return instance; synchronized (EventBus.class) { if (instance == null) instance = new EventBus(); } return instance; } public void regiestEvent(Object object) { if (datas.contains(object)) { throw new RuntimeException("不能重复注册"); } datas.add(object); } public void unRegiestEvent(Object object) { if (!datas.contains(object)) throw new RuntimeException("没有注册无法取消注册"); datas.remove(object); } public <T> void post(final T data) { post(data,""); } public <T> void post(final T data, String tag) { for (Object tempObject : datas) { Class clazz = tempObject.getClass(); Method[] methods = clazz.getDeclaredMethods(); for (Method tempMethod : methods) { Subscriber anno = tempMethod.getAnnotation(Subscriber.class); //这表示这个方法没有这个注解 if (anno == null) continue; //这表示这个注解上的tag的值与你指定的不同 if (!anno.tag().equals(tag)) continue; //这表示这个方法上的参数类型与post发送的参数类型不同 if(!tempMethod.getParameterTypes()[0].getSimpleName().equals(data.getClass().getSimpleName())) continue; final Method method = tempMethod; final Object object = tempObject; if (anno.threadMode() == ThreadMode.MAIN) try { method.invoke(object, data); } catch (Exception e) { e.printStackTrace(); } else if (anno.threadMode() == ThreadMode.CREATE_THREAD) { singleThread.execute(new Runnable() { @Override public void run() { try { method.invoke(object, data); } catch (Exception e) { e.printStackTrace(); } } }); } else if (anno.threadMode() == ThreadMode.NOT_MAIN) { if (Thread.currentThread() == Looper.getMainLooper().getThread()) { singleThread.execute(new Runnable() { @Override public void run() { try { method.invoke(object, data); } catch (Exception e) { e.printStackTrace(); } } }); } else { try { method.invoke(object, data); } catch (Exception e) { e.printStackTrace(); } } } } } } }