EventBus使用详解(二)

EventBus四种线程模式

在EventBus的事件处理函数中需要指定线程模型,即指定事件处理函数运行所在的线程。

  • POSTING(默认):使用该模式,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。
  • MAIN:事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。
  • BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
  • ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。

我们验证一下以上事件的正确性。

    //POSTING
    @Subscribe(threadMode = ThreadMode.POSTING)
    public void onMessageEventPostThread(MessageEvent messageEvent) {
        Log.e("Log", "PostThread-->" + Thread.currentThread().getName());
    }

    //MAIN
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEventMainThread(MessageEvent messageEvent) {
        Log.e("Log", "MainThread-->" + Thread.currentThread().getName());
    }

    //BACKGROUND
    @Subscribe(threadMode = ThreadMode.BACKGROUND)
    public void onMessageEventBackgroundThread(MessageEvent messageEvent) {
        Log.e("Log", "BackgroundThread-->" + Thread.currentThread().getName());
    }

    //ASYNC
    @Subscribe(threadMode = ThreadMode.ASYNC)
    public void onMessageEventAsync(MessageEvent messageEvent) {
        Log.e("Log", "Async-->" + Thread.currentThread().getName());
    }

(1)主线程中发送事件

public void fourMode(View view) {
    //主线程中发送
    EventBus.getDefault().post(new MessageEvent()); 
}

//运行结果
PostThread-->main
MainThread-->main
BackgroundThread-->pool-1-thread-2
Async-->pool-1-thread-1

(2)子线程中发送事件

public void fourMode(View view) {
    //子线程中发送
    new Thread(new Runnable() {
        @Override
        public void run() {
            EventBus.getDefault().post(new MessageEvent());
        }
    }).start();
}

//运行结果
PostThread-->Thread-28814
MainThread-->main
BackgroundThread-->Thread-28814
Async-->pool-1-thread-1

以上就是四种模式的区别啦。

你可能感兴趣的:(Android第三方框架)