EventBus 笔记

分发线程(Thread Mode)

原文链接

EventBus可以帮你处理线程:事件可以在不同于发布线程的线程中发布。一个常见的用例是更新UI。在Android中,UI更新必须在UI(main)线程中完成。另一方面,网络或任何耗时的任务都不能在主线程上运行。EventBus帮助您处理这些任务并与UI线程同步(无需深入研究线程转换、使用AsyncTask等)。
在EventBus中,可以使用五个线程模式之一来处理接收事件。

ThreadMode: POSTING

默认模式,订阅者将在同一线程中调用该事件。事件传递是同步完成的,一旦发布完成,所有订阅者都将被调用。
优点:最小的开销,避免线程切换。简单任务,推荐使用这种模式,不需要是主线程
注意事项:处理程序应快速返回,以避免阻塞线程

// Called in the same thread (default)
// ThreadMode is optional here
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessage(MessageEvent event) {
    log(event.message);
}

ThreadMode: MAIN

订阅者将在Android的UI线程中调用。如果发布线程是主线程,则将直接调用事件处理方法
注意事项:处理程序应快速返回,以避免阻塞UI线程

// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
    textField.setText(event.message);
}

ThreadMode: MAIN_ORDERED

订阅者将在Android的UI线程中被调用。该事件总是排队等待传递给订阅者,因此对POST的调用后立即返回。这给事件处理提供了更严格和更一致的顺序。例如,如果在MAIN线程模式中发布另一个事件,则第二个事件处理程序将在第一个事件处理程序之前完成。使用MAIN_ORDERED线程模式,第一个事件处理程序结束,然后第二个事件处理程序将在稍后的时间点被调用(只要主线程有容量)。

// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
public void onMessage(MessageEvent event) {
    textField.setText(event.message);
}

ThreadMode: BACKGROUND

订阅者将在后台线程中被调用。如果发布线程不是UI线程,则将在POST线程中直接调用事件处理方法。如果发布线程是主线程,EventBus使用一个将会依次传递所有事件的单个后台线程。
注意事项:处理程序应尽量快速返回,以避免阻塞后台线程。

// Called in the background thread
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
    saveToDisk(event.message);
}

ThreadMode: ASYNC

事件处理方法在单独的线程中被调用。这始终与发布线程和主线程无关。发布事件永远不会等待事件处理方法。
使用场景:事件处理可能需要一些时间,例如用于网络访问。
EventBus使用线程池来有效地重用线程。避免同时触发大量长时间运行的异步处理方法,限制并发线程的数量。

// Called in a separate thread
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
    backend.send(event.message);
}

猜你喜欢

转载自blog.csdn.net/huagbo/article/details/82657707
今日推荐