1.EventBus的介绍与使用
1.1常见的组件间的通信方式
- Intent:跳转+传参(局限性非常大)
- Handler:通常用来更新主线程UI,使用不当容易出现内存泄露
- Interface:接口回调,仅限于同一线程中数据交互
- BroadcastReceiver:有序广播+无序广播
- AIDL:跨进程通信,代码阅读性不友好,维护成本偏高
EventBus优点
- 代码简单,快
- Jar包小,~50k
- Activity,Fragment以及线程通信优秀
- 稳定,在一亿+应用中得到实践
1.2EventBus定义
EventBus是一个Android优化的publish/subscribe消息事件总线,简化了应用程序内各个组件间、组件与后台线程间的通信。如Activites、Fragments、Threads、Services
1.3使用场景
比如网络请求,返回时通过Handler或者BroadCastReceiver通知更新主线程UI
N个Fragment之间需要通过Listener(监听)通信
这些需求都可以通过EventBus完成和实现。可以在任何地方发布事件,任何地方订阅消费事件。完美的简化了跨组件、跨线程等方面通信的问题。
1.4官方架构图
1.5简单使用
-
导入EventBus库:implementation ‘org.greenrobot:eventbus:3.1.1’
-
注册和注销
@Override protected void onCreate() { super.onStart(); EventBus.getDefault().register(this); } @Override protected void onDestroy() { super.onStop(); if (EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().unregister(this); } }
-
官方三步曲
-
定义事件
public class MessageEvent { /*Additional fields if needed*/ }
-
订阅事件(注解+方法指定参数)
@Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { /*Do something*/ //监听到了发布的事件(消息) //进行相关操作,比如更新UI等 }
-
发布事件(发送消息)
EventBus.getDefault().post(new MessageEvent());
-
-
EventBus粘性事件(@Subscribe注解中加入:sticky = true 作用:延时消费或者初始化)
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true) public void onMessageEvent(UserInfo user) { Log.d(TAG, user.toString()); /*Do something*/ //监听到了发布的事件(消息) //进行相关操作,比如更新UI等 //如果请求接口然后再发送事件再进行控件的更新。有时候该控件所在的页面可能没有初始化好。 //这时候eventbus所发送的事件就不会起作用。这时候就要用到粘性事件。粘性事件可以先发送 //事件,待接收方订阅后接受事件。其实就是解决异步所带来的问题 }
-
订阅方法执行的优先级(如果两个或多个地方订阅同一事件,优先级高的先接收)
@Subscribe(threadMode = ThreadMode.MAIN, priority = 1) public void onMessageEvent(UserInfo user) { //消费事件/消息 textView.setText(user.toString()); Log.d(TAG, "onMessageEve