深入了解EventBus

一、使用EventBus带来的好处和目的

主要功能是替代Intent、Handler、BroadCast在Fragment、Activity、Service、线程之间传递消息。

最牛逼优点是开销小,代码简洁,解耦代码。

二、EventBus的基本使用

1、implementation 'org.greenrobot:eventbus:3.0.0'

2、onCreate中订阅

EventBus.getDefault().register(this);

3、onDestroy中取消订阅

EventBus.getDefault().unregister(this);

4、发送消息

   //post(Object event)参数是自定义的,接收的地方也是对应自定义的
                EventBus.getDefault().post(new NetworkChangeEvent(isConnected));

5、接收

//接收页面的Event的值跟EventBus.getDefault().post(obj);
    // 的发送的值相同,则此页面就接收到通知,如果多个页面都有同一个event,则这几个页面都可以收到通知。
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onNetChangeEvent(NetworkChangeEvent networkChangeEvent){
        hasNetWork(networkChangeEvent.isConnected);
    }

其他用于接收的方法

 @Subscribe(threadMode = ThreadMode.POSTING)

 @Subscribe(threadMode = ThreadMode.MAIN)

 @Subscribe(threadMode = ThreadMode.BACKGROUND)

  @Subscribe(threadMode = ThreadMode.ASYNC)

区别:

POSTING默认方式:发布和接收在同一线程。
MAIN:无论在哪个线程发都会在主线程收。
BACKGROUND:子线程发主线程收;主线程发子线程收。
ASYNC:无论哪个线程发都会在主线程收。

三、原理解析

每个新建的EventBus发布和订阅事件都是相互隔离的。

EventBus实质就是观察者模式。说俗点通过分析和上图可以直观认为上图中EventBus椭圆是一个具备存储匹配方法的一个单例对象;右侧Subscriber块的onEventXXX就是这些匹配方法;左侧的post就是根据参数去查找反射调运右侧那些已定义的onEventXXX方法。

通过反射机制筛选订阅者里面的方法

扫描二维码关注公众号,回复: 2783232 查看本文章

经过修饰符、参数个数、是否有注解、和订阅者是否有 eventType 相同的方法几层条件的筛选,最终将订阅方法添加进 findState 的 subscriberMethods 这个 List 中。EventBus 不仅仅获取当前类的订阅方法,还会获取它所有父类的订阅方法。

大神对源码的解析

猜你喜欢

转载自blog.csdn.net/u013359807/article/details/81330487