EventBus3.0使用总结(二)EventBus的线程模式

EventBus3.0使用总结(一)简单使用介绍了EventBus3.0的简单使用。

在通过指定线程模式声明订阅方法的时候使用的是ThreadMode.MAIN线程模式。

@Subscribe(threadMode = ThreadMode.MAIN) 

EventBus有4种线程模式:

  1. ThreadMode: POSTING
  2. ThreadMode: MAIN
  3. ThreadMode: BACKGROUND
  4. 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);
}

以上代码模拟场景:

  1. 点击按钮发送一个MessageEvent
  2. BACKGROUND线程模式下的订阅者监听MessageEvent,接收到MessageEvent后改变数据,然后发送一个BackgroundEvent事件
  3. MAIN线程模式下的订阅者监听BackgroundEvent,然后更新UI。

ThreadMode: ASYNC

该模式的订阅事件是在独立的线程中运行,既不在发布事件的线程中,也不在主线程中。
EventBus有专门的线程池对子线程进行管理,但仍然要避免同一时间开启太多的ASYNC模式线程。

ASYNC模式方便用来进行网络加载。

到此,EventBus的线程模式都介绍完了,本质区别是EventBus的订阅事件如何Delivery(消费)。

欢迎大家留言讨论!

你可能感兴趣的:(Android开源库实战)