一、使用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方法。
通过反射机制筛选订阅者里面的方法
经过修饰符、参数个数、是否有注解、和订阅者是否有 eventType 相同的方法几层条件的筛选,最终将订阅方法添加进 findState 的 subscriberMethods 这个 List 中。EventBus 不仅仅获取当前类的订阅方法,还会获取它所有父类的订阅方法。