看了 姜糖水 用最简单的代码实现EventBus的基本思路 , 大概思路大概能明白 , 所以试试自己动手 , 最后发现他写的好像不太对–虽然思路解释清楚了 , 于是自己找官方的源码看 , 然后自己参考了EventBus源码和姜糖水写的代码写了一份代码 . 看不懂的先去看 姜糖水 的思路解释 –本人不善于描述.
//Bus.java
import android.os.Looper;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* Created by Thinker on 2015/12/12.
*/
public class Bus {
private static volatile Bus mInstance;
//用于查找onEvent开头并且只有一个参数的方法
Finder mFinder;
//用于post(event) 添加到handler中执行
PostHandler mHandler;
//key 参数类型 , value Subscriber对象集合
Map<Class<?>, CopyOnWriteArrayList<Subscriber>> subscriberByEventType;
//key 注册的类对象 , value 参数类型集合(subscriberByEventType的key)
Map<Object, List<Class<?>>> typesBySubscriber;
private Bus() {
mFinder = new NameBasedFinder();
subscriberByEventType = new HashMap<>();
typesBySubscriber = new HashMap<>();
mHandler = new PostHandler(this, Looper.getMainLooper()/*指定在主线程*/);
}
/**
* 获取唯一单例
*
* @return
*/
public static Bus getDefault() {
if (null == mInstance) {
synchronized (Bus.class) {
if (null == mInstance) {
mInstance = new Bus();
}
}
}
return mInstance;
}
/**
* 注册
*
* @param subscriber
*/
public void register(Object subscriber) {
//获取注册的类的所有onEvent开头并且只有一个参数的方法
List<Method> methods = mFinder.findSubscriber(subscriber.getClass());
for (Method method : methods) {
subscriber(subscriber, method);
}
}
private void subscriber(Object subscriber, Method method) {
//将方法封装成对象
Subscriber subscriber1 = new Subscriber(subscriber, method);
//方法的参数类型
Class<?> eventType = subscriber1.mEventType;
//获取参数类型的对象集合,在集合的后面添加上面的对象
CopyOnWriteArrayList<Subscriber> subscribers =
subscriberByEventType.get(eventType);
if (null == subscribers) {
subscribers = new CopyOnWriteArrayList<>();
subscriberByEventType.put(eventType, subscribers);
}
subscribers.add(subscriber1);
//获取类的方法的参数集合 , 一个类(例如activity)可能包含多个
// onEvent开头并且只有一个参数的方法
List<Class<?>> subscriberEvents = typesBySubscriber.get(subscriber);
if (null == subscriberEvents) {
subscriberEvents = new ArrayList<>();
typesBySubscriber.put(subscriber, subscriberEvents);
}
subscriberEvents.add(eventType);
}
/**
* 注销
*
* @param subscriber
*/
public void unregister(Object subscriber) {
//获取类已经注册的方法
List<Class<?>> subscriberEvents = typesBySubscriber.get(subscriber);
if (null != subscriberEvents) {
for (Class<?> subscriberEvent : subscriberEvents) {
unsubscriber(subscriber, subscriberEvent);
}
//释放内存
typesBySubscriber.remove(subscriber);
}
}
private void unsubscriber(Object subscriber, Class<?> subscriberEvent) {
//通过参数类型找到所有的Subscriber集合
CopyOnWriteArrayList<Subscriber> subscribers =
subscriberByEventType.get(subscriberEvent);
if (null != subscribers) {
int size = subscribers.size();
for (int i = 0; i < size; i++) {
Subscriber subscriber1 = subscribers.get(i);
if (subscriber1.mSubscriber == subscriber) {
subscriber1.mEventType = null;
subscriber1.mMethod = null;
subscriber1.mSubscriber = null;
subscribers.remove(i);
i--;
size--;
}
}
}
}
/**
* 发布消息
*
* @param event
*/
public void post(Object event) {
mHandler.post(event);
}
}
//Finder.java
import java.lang.reflect.Method;
import java.util.List;
/**
* Created by Thinker on 2015/12/12.
*/
public interface Finder {
List<Method> findSubscriber(Class<?> subscriber);
}
//NameBasedFinder.java
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Thinker on 2015/12/12.
*/
public class NameBasedFinder implements Finder {
@Override
public List<Method> findSubscriber(Class<?> subscriber) {
List<Method> methods = new ArrayList<>();
//遍历类的所有方法
for (Method method : subscriber.getDeclaredMethods()) {
//onEvent开头并且只有一个参数的方法
if (method.getName().startsWith("onEvent")
&& method.getParameterTypes().length == 1) {
methods.add(method);
}
}
return methods;
}
}
//PostHandler.java
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* Created by Thinker on 2015/12/12.
*/
public class PostHandler extends Handler {
Bus mBus;
PostHandler(Bus bus, Looper looper) {
//指定该handler在looper线程上
super(looper);
this.mBus = bus;
}
@Override
public void handleMessage(Message msg) {
//根据参数类型查找所有的onEvent的方法
CopyOnWriteArrayList<Subscriber> subscribers =
mBus.subscriberByEventType.get(msg.obj.getClass());
for (Subscriber subscriber : subscribers) {
try {
//通过反射机制执行onEvent方法
subscriber.mMethod.invoke(subscriber.mSubscriber, msg.obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void post(Object event) {
Message msg = obtainMessage();
msg.obj = event;
sendMessage(msg);
}
}
//Subscriber.java
import java.lang.reflect.Method;
/**
* Created by Thinker on 2015/12/12.
*/
public class Subscriber {
//注册的类
Object mSubscriber;
//注册类上的方法
Method mMethod;
//方法的参数类型
Class<?> mEventType;
public Subscriber(Object mSubscriber, Method mMethod) {
this.mSubscriber = mSubscriber;
this.mMethod = mMethod;
this.mEventType = mMethod.getParameterTypes()[0];
}
}