- 简化组件之间的通讯
- 将事件发送者和事件接受者之间解耦
- 在Activities,Fragments和后台线程中运行良好
- 避免复杂的容易出错的关联和生命周期的问题
- 使你的代码更加简洁
- 速度快
- jar包小 (<50k jar)
- 使用EventBus的软件安装量在亿次以上,广泛使用
- 有高级的属性比如发送线程模式,订阅者的优先级,等等
接着进入正题,看一下Eventbus的传送线程的线程模式,首先我们先看一下代码,看一下运行效果,在分析结果;
代码如下所示:
public class SecondActivity extends AppCompatActivity { Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.content_main); button = (Button) findViewById(R.id.button); EventBus.getDefault().register(this); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EventBus.getDefault().post(new MessageEvent("EventBus first")); } }); new Thread(){ @Override public void run() { try{ Thread.sleep(3000); }catch (Exception e){ } EventBus.getDefault().post(new MessageEvent("EventBus new thread")); } }.start(); } @Subscribe(threadMode = ThreadMode.POSTING) public void onMessagePosting(MessageEvent event){ System.out.println("onMessagePosting===" + event.message +" Thread name==" + Thread.currentThread().getName()); } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageMain(MessageEvent event){ System.out.println("onMessageMain===" + event.message+" Thread name==" + Thread.currentThread().getName()); } @Subscribe(threadMode = ThreadMode.BACKGROUND) public void onMessageBackground(MessageEvent event){ System.out.println("onMessageBackground===" + event.message+" Thread name==" + Thread.currentThread().getName()); } @Subscribe(threadMode = ThreadMode.ASYNC) public void onMessageAsync(MessageEvent event){ System.out.println("onMessageAsync===" + event.message+" Thread name==" + Thread.currentThread().getName()); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } // its super classes have no public methods with the @Subscribe annotati 必须是public方法 }
启动之后,创建的线程中发送的事件执行结果如下:
Button点击之后,发送的事件执行结果如下:
根据执行的结果,来学习线程模式:
ThreadMode: POSTING 这个订阅者(方法)和post在同一个线程中。
ThreadMode: MAIN:订阅者将在Android的主线程(UI线程)中被调用。
ThreadMode: BACKGROUND:订阅者将在后台线程中被调用。如果发送时候的线程不是主线程,事件处理方法将直接在发送时的线程中被调用。
如果发送时候的线程是主线程,EventBus使用一个单一后台线程来进行顺序传送所有它的事件(在同一个Activity生命周期内,以后一直使用这个后台线程,所以
第N次点击时候和第一次点击时候BACKGROUND的线程名称是一致的)。
ThreadMode: ASYNC:订阅者将在一个单独的线程中被调用。这个线程独立于发送时的线程和主线程。EventBus使用一个线程池来高效复用线程,复用
线程来自于异步的事件处理通知。EventBus能够为你处理线程:事件能够从不同的线程之间进行传送。一个普通的用例就是处理UI变化。在Android中,UI变化必须在UI(主)线程中被完成。另一方面,网络请求或者其他耗时的任务,必须在工作线程中运行。EventBus帮助你处理这些任务与UI线程同步(没有必要深入研究线程转换,使用AsyncTask,等等)。