版权声明:欢迎大家留言讨论 https://blog.csdn.net/u014733374/article/details/72625700
EventBus3.0使用总结(一)简单使用介绍了EventBus3.0的简单使用。
在通过指定线程模式声明订阅方法的时候使用的是ThreadMode.MAIN线程模式。
@Subscribe(threadMode = ThreadMode.MAIN)
EventBus有4种线程模式:
- ThreadMode: POSTING
- ThreadMode: MAIN
- ThreadMode: BACKGROUND
- ThreadMode: ASYNC
可以在同一个线程中进行事件的绑定和发布,也可以在不同线程中进行事件的绑定和发布;EventBus对线程进行了安全管理。
ThreadMode: POSTING
POSTING模式是EventBus默认的线程模式,要求发送和订阅Event的操作在同一线程中进行。因为避免了线程切换操作,所以该模式运行效率最快。当然这种模式的线程通常都代表Android的主线程,因此尽量避免在该订阅事件中进行耗时操作。
上一篇文章简单实例中的订阅事件就可以改为:
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessageEvent(MessageEvent event){
String msgInfo = event.getMsg();
infoTV.setText(msgInfo);
}
ThreadMode: MAIN
该线程模式下的订阅者需要运行在Android的主线程中。如果在该模式下发送事件的操作在主线程中,其效果跟POSTING模式一样。但是通常该模式的发布事件都是在子线程中运行,然后主线程中订阅事件去响应UI。
简单实例:
/**
* 点击事件
* @param view
*/
public void post(View view){
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3*1000);
EventBus.getDefault().post(new MessageEvent("收到更新数据"));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event){
String msgInfo = event.getMsg();
infoTV.setText(msgInfo);
}
ThreadMode: BACKGROUND
订阅事件在子线程执行,两种情况:
- 如果在子线程中Post(发送)Event事件,那么该模式的订阅事件也在当前子线程执行;
- 如果在主线程中Post(发送)Event事件,那么EventBus会给该模式的订阅事件创建一个独立的子线程来执行订阅方法。
/**
* 点击事件
* @param view
*/
public void post(View view){
EventBus.getDefault().post(new MessageEvent("收到更新数据"));
}
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessageEvent(MessageEvent event){
String msgInfo = event.getMsg();
msgInfo = Thread.currentThread().getName() + "子线程中修改了参数";
EventBus.getDefault().post(new BackgroundEvent(msgInfo));
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMainMessageEvent(BackgroundEvent event){
String info = event.getMsg();
infoTV.setText(info);
}
以上代码模拟场景:
- 点击按钮发送一个MessageEvent
- BACKGROUND线程模式下的订阅者监听MessageEvent,接收到MessageEvent后改变数据,然后发送一个BackgroundEvent事件
- MAIN线程模式下的订阅者监听BackgroundEvent,然后更新UI。
ThreadMode: ASYNC
该模式的订阅事件是在独立的线程中运行,既不在发布事件的线程中,也不在主线程中。
EventBus有专门的线程池对子线程进行管理,但仍然要避免同一时间开启太多的ASYNC模式线程。
ASYNC模式方便用来进行网络加载。
到此,EventBus的线程模式都介绍完了,本质区别是EventBus的订阅事件如何Delivery(消费)。
欢迎大家留言讨论!