美文网首页Android实用技术
日更(十七)-Android-EventBus到底是个啥

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

作者: Jlanglang | 来源:发表于2019-01-17 22:56 被阅读99次

瞎扯

干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

相关文章

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

    瞎扯 干android有段时间的人,应该都用过eventbus,rxbus之类的 那么,这个东西是怎么实现通信的....

  • 日更,坚持个啥劲?

    和朋友聊到在简书上写东西的话题,他说他早就不看简书了,没想到我居然还会在这上面写东西。我说我坚持连续日更2个月了,...

  • 日更十七

    "儒医与西医、儒教与一神邪教"之间区别!(胡医生) 一、 形而上者,谓之"道";形而下者,谓之"器"。 道,即"规...

  • 日更十七

    回京 雾霾

  • 日更【十七】

    开始慢慢学会收敛,学会从另一个角度回答问题。 终于没有一根筋走到底,只是覆水难收。 人一到晚上就开始把白天被...

  • 日更 十七

    想到期末的七八篇论文我就发自内心的开心呢。

  • 日更十七

    今天是否迟了点,超过十一点了 今天干什么了呢? 上午去买了猪肚和半只鸡,前阵子煲过这汤,味道很不错,所以现在想再吃...

  • 日更十七

    DDD领域驱动设计中领域事件(Domain Event)约定 领域事件是领域实体发生状态变化后,向外界发布(pub...

  • 日更十七

    两只猫咪这几天开始打架了。 以前它们俩是你追我赶上蹿下跳,虽然有时候也能扭打成一团,但是我可以明显感觉到它们是在玩...

  • 日更更啥好?

    啊,亲爱的日更,我真是对你又爱又恨。 每次都纠结该写啥,不知是该碎碎念还是看图写诗。 绞尽脑汁也没想到适合的...

网友评论

    本文标题:日更(十七)-Android-EventBus到底是个啥

    本文链接:https://www.haomeiwen.com/subject/ldhwdqtx.html