一、EventBus框架的github地址:github.com/greenrobot/EventBus
主要用于事件的发布和订阅,是一个发布/订阅的事件总线
包含四个成分:发布者、订阅者、事件和总线
四者之间的关系:订阅者订阅事件到总线,发送者发布事件,订阅者可以订阅多个事件,发送者可以发布任何事件,发布者同时也可以是订阅者
二、实例
两个Fragment组成主界面,左边的Fragment是目录(列表),右边的Fragment是详细信息界面
1、左边目录是从网络获取的;
2、当点击目录上的列表条目的时候,动态更新详细信息界面
传统的做法是:
1、左边目录Fragment在onCreate中去开启线程去访问网络获取数据,获取完成之后通过handler去更新界面
2、左边目录Fragment提供一个接口,然后详细信息界面去注册这个接口,当发生点击时,去回调这个接口,让详细信息界面发生改变,这一传统的操作方法可以用EventBus来代替完成
EventBus的做法是:
EventBus.getDefault().register(this);//订阅事件
EventBus.getDefault().post(object);//发布事件
EventBus.getDefault().unregister(this);//取消订阅
1、在onCreate中进行了事件的订阅,,onDestroy里进行了事件的取消,onViewCreate里模拟一个子线程去网络加载数据,获取成功后我们调用EventBus.getDefault().post()发布一个事件
2、总得流程是:onCreate时,EventBus扫描当前类,将onEventMainThread以键值对的形式存储,键为Item.class,值为包含该方法的对象,当点击事件发生时,出发onEventMainThread方法,并把item值传进来,更新控件
三、EventBus的ThreadMode
1、EventBus包含4个ThreadMode:PostThread,MainThread,BackgroundThread,Async
2、具体的方法名为:onEventPostThread, onEventMainThread,onEventBackgroundThread,onEventAsync
3、区别:
onEventMainThread代表这个方法会在UI线程执行
onEventPostThread代表这个方法会在当前发布事件的线程执行
BackgroundThread这个方法,如果在非UI线程发布的事件,则直接执行,和发布在同一个线程中。如果在UI线程发布的事件,则加入后台任务队列,使用线程池一个接一个调用
Async 加入后台任务队列,使用线程池调用,注意没有BackgroundThread中的一个接一个