日更(十七)-Android-EventBus到底是个啥
2019-01-17 本文已影响99人
Jlanglang
瞎扯
干android有段时间的人,应该都用过eventbus,rxbus之类的
那么,这个东西是怎么实现通信的.
其实要说原理的话,很简单....
生产者/消费者模式
说到生产者,消费者.
可以想到handler.looper
.也是生产者/消费者,
这个是同步的.所以looper
是个阻塞的死循环
就好比你去饭店排队点餐.需要排队
你排队点餐就是生产者
点餐员就是消费者
eventbus
也是生产者/消费者.
但是eventbus不需要同步.
这个是异步的,因为每个事件都有单独的消费者.
post =>register
register
的回调是消费者
post
的event消息就是生产者.
实现bus的几个点
一个单例
我们需要一个单例,里面有一个Map集合,来保存type.回调,
但是一个type,可能有多种状态,所以再嵌套一层code.当然只要你愿意,还可以在嵌套
不过我觉得2层已经足够了,
public class Event {
//保存注册的事件
private static final Map<Class, Map<Object, Callback>> map = new HashMap<>();
}
register
就是把Type,和回调,保存到集合里
//注册事件,消费者
public static void register(Class type, Object code, Callback callback) {
Map<Object, Callback> callbackMap = map.get(type);
if (callbackMap == null) {//判断这个type,有没有被注册过
callbackMap = new HashMap<>();
callbackMap.put(code, callback);//添加code,与回调
map.put(type, callbackMap);
} else {
callbackMap.put(code, callback);
}
}
Post方法
post方法,实际上实现就是,
去单例的集合里面,找出对应的type.
然后取出回调.把post传进来的内容传到回调里.
//发生消息,event,生产者
public static void post(Class type, Object code, Object action) {
Map<Object, Callback> objectCallbackMap = map.get(type);//判断这个type有没有注册
if (objectCallbackMap == null) {
return;
}
Callback callback = objectCallbackMap.get(code);//获取对应code的回调
if (callback != null) {
callback.call(action);
}
}
全部代码
public class Event {
//保存注册的事件
private static final Map<Class, Map<Object, Callback>> map = new HashMap<>();
//发送event消息,生产者
public static void post(Class type, Object code, Object action) {
Map<Object, Callback> objectCallbackMap = map.get(type);//判断这个type有没有注册
if (objectCallbackMap == null) {
return;
}
Callback callback = objectCallbackMap.get(code);//获取对应code的回调
if (callback != null) {
callback.call(action);
}
}
//注册事件,回调就是消费者
public static void register(Class type, Object code, Callback callback) {
Map<Object, Callback> callbackMap = map.get(type);
if (callbackMap == null) {//判断这个type,有没有被注册过
callbackMap = new HashMap<>();
callbackMap.put(code, callback);//添加code,与回调
map.put(type, callbackMap);
} else {
callbackMap.put(code, callback);
}
}
/**
* 事件回调
*/
public interface Callback {
void call(Object o);
}
}
不扯设计,实现总结
其实通俗点讲就是:
1.一个单例保存Type和回调
2.因为是单例,所以其保存的相当于全局可见可用
3.所以在取消注册前(也就是从单例中删除),相当于是全局的,也就会一直存在内存中
4.然后就能随时访问里面的回调.达到跨域通信的目的.
一句话:想了一个办法,能直接访问需要的内存中的某个对象.
至于注解啥的啊,就像昨天写的,只是加个标记方便扩展,生成判断代码,节省代码用的.
您的喜欢与回复是我最大的动力-_-
交流群:493180098