EventBus3.0的简单使用
1.介绍:
EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。简单的说,就是处理不同线程或者不同组件的数据通讯的问题。
盗用GiHub上EventBus的一张图。
可以看到,发布者(Publisher
)使用post()
方法将Event
发送到Event Bus
,而后Event Bus
自动将Event
发送到多个订阅者(Subcriber
)。这里需要注意两个地方:
(1)一个发布者可以对应多个订阅者。
(2)3.0以前订阅者的订阅方法为onEvent()
、onEventMainThread()
、onEventBackgroundThread()
和onEventAsync()
。在Event Bus3.0
之后统一采用注解@Subscribe
的形式,具体实现方式见下文。
2.导入:
androidStuio 在build.gradle添加依赖库
compile 'de.greenrobot:eventbus:3.0.0-beta1'
3.简单使用,直接上代码
<span style="font-size:18px;"><span style="font-size:14px;">public class UserEventBus extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.eventbus);
//注册EventBus
EventBus.getDefault().register(this);
startActivity(new Intent(this,SecondActivity.class)); //跳转另一个Activity
}
@Subscribe(threadMode = ThreadMode.MainThread)
public void eventBusMain(String str){
Log.i("TAG","MAIN:"+str+" Thread = "+Thread.currentThread().getId());
}
@Subscribe(threadMode = ThreadMode.BackgroundThread)
public void eventBusBg(String str){
Log.i("TAG", "BACKGROUND:"+str+" Thread="+Thread.currentThread().getId());
}
@Subscribe(threadMode = ThreadMode.PostThread)
public void eventBusPosting(String str){
Log.i("TAG", "POSTING:"+str+" Thread="+Thread.currentThread().getId());
}
@Subscribe(threadMode = ThreadMode.Async)
public void eventBusAsync(String str){
Log.i("TAG", "ASYNC:"+str+" Thread="+Thread.currentThread().getId());
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this); //销毁EventBus,一定记得销毁,不然数据会混乱
}</span></span>
<span style="font-size:18px;"><span style="font-size:14px;">
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.eventbus);
EventBus.getDefault().post("from second activity mainThread: info");
Log.i("TAG", "Post thread="+Thread.currentThread().getId());
new Thread(new Runnable() {
@Override
public void run() {
EventBus.getDefault().post("from second activity childThread: info");
Log.i("TAG", "Post thread="+Thread.currentThread().getId());
}
}).start();
}
}
</span></span>
打印结果:
<span style="font-size:14px;">I/TAG: MAIN:from second activity mainThread: info Thread = 1
I/TAG: ASYNC:from second activity mainThread: info Thread=16105
I/TAG: POSTING:from second activity mainThread: info Thread=1
I/TAG: Post thread=1
I/TAG: BACKGROUND:from second activity mainThread: info Thread=16106
I/TAG: BACKGROUND:from second activity childThread: info Thread=16107
I/TAG: ASYNC:from second activity childThread: info Thread=16105
I/TAG: POSTING:from second activity childThread: info Thread=16107
I/TAG: Post thread=16107</span>
备注:
1.threadMode
ThreadMode.MAIN,事件接收函数执行在UI线程;
ThreadMode.POST,事件在哪个线程发布,接收函数就执行在哪个线程;默认
ThreadMode.ASYNC,事件执行在一个独立的异步线程中。强制在后台执行
ThreadMode.BackgroundThread,如果事件是在UI线程中发布出来的,那么就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么直接在该子线程中执行。
如果由于事件的发布者是在子线程中,所以BACKGROUND与POSTING模式下订阅者与事件的发布者运行在同一个线程。
而ASYNC模式下又重新开起一个线程来执行任务。Main模式则是在主线程中运行
2.由于接受数据为Object的类型,所以大家可以传输任意一个对象,我这里为了方便就用String类型。