Android 简化应用程序组件(Activity、Fragment、线程)间通信的开源项目 EventBus

项目地址:https://github.com/greenrobot/EventBus/


项目使用的技术呢,说白了,就是将要传递的event(一个Object对象,可任意自定义),发送到公共的组件EventBus中进行存储,

在通过EventBus传递给订阅者(使用者),订阅者收到event消息,就可以自行处理了。


不要被标题迷惑了,其实在任何地方 都可以发送和接收event(event,是一个通称,表示任意的数据对象,是一个消息类型)。

当然有需要注意的地方了,往下看吧。


分析一个基本的使用流程:


1. 自定义一个event类型:需要什么样的数据,就定义成什么样,随意了


2. 确定在哪里来接收该event,就在哪里调用EventBus.getDefault().register()进行订阅者的注册。

   EventBus 一看就是个单例类,所以通过它存储、发送event。

   register()有多个重载方法:

    public void register(Object subscriber) {
        register(subscriber, false, 0);
    }

    public void register(Object subscriber, int priority) {
        register(subscriber, false, priority);
    }

    public void registerSticky(Object subscriber) {
        register(subscriber, true, 0);
    }

    public void registerSticky(Object subscriber, int priority) {
        register(subscriber, true, priority);
    }
    private void subscribe(Object subscriber, SubscriberMethod subscriberMethod, boolean sticky, int priority) {
        ...
    }

      看名字也很好理解,subscriber即订阅者(接收处理event的类);priority即优先级,表示优先处理;

      sticky粘性的意思,在源码中会有一个map对象,来存储sticky的event,

          因为map的key是onEvent...()方法的第一个参数类型,

          一般呢,这第一个参数就是订阅者对象,所以map会存储该类型的最后一次发送的event对象。

      这些register都会最终调用一个私有register方法实现的,在这个方法里有个参数是SubscriberMethod对象。

            调用subscriberMethod.findSubscriberMethods(), 查找到订阅者定义的接收处理event的方法,

      并在EventBus中存起来。


3.  在订阅者中定义接收处理event的方法,约定为:

     onEvent、onEventMainThread、onEventBackgroundThread、onEventAsync 

     使用时类似这样的:public void onEvent(Object event)。 onEvent对应PostThread,其他各自对应ThreadMode中的其他定义。

     onEvent后面跟的这些名称的意义,见ThreadMode


4. 发送事件

   调用EventBus.getDefault().post(Object event),发送事件   

   源码中会调用postToSubscription(),发送event给对应的订阅者方法


ThreadMode

   这是一个枚举类。定义了四种类型:PostThread、MainThread、BackgroundThread、Async 

   PostThread  事件event的处理和发送都在相同线程中

   MainThread  事件event的处理在主线程中,小心ANR

   BackgroundThread 事件event的处理在后台线程中,它是阻塞式的,如有多个事件发送过来,会一个一个处理

   Async 事件event的处理是异步的,即新开一个线程进行处理。




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。