日更(十七)-Android-EventBus到底是个啥

瞎扯

干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

猜你喜欢

转载自blog.csdn.net/weixin_33769125/article/details/86984791