EventBus的使用
使用EventBus, 主要目的在于实现App组件间通信的解耦.
git地址: https://github.com/greenrobot/EventBus
基本使用流程:
1. 编写事件类
public class AnyTypeEvent { private String someMsg; public AnyTypeEvent(String message) { this.someMsg = message; } public String getSomeMsg() { return someMsg; } public void setSomeMsg(String someMsg) { this.someMsg = someMsg; } }
2. 注册事件订阅者
public class EventTestActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.act_event_test); EventBus.getDefault().register(this); // 注册当前Activity为订阅者 // EventBus.getDefault()是一个单例实现的作用域范围为进程的event bus } @Override protected void onDestroy() { EventBus.getDefault().unregister(this); // 注销订阅者 super.onDestroy(); } }
3. 在订阅者内部实现订阅函数
订阅函数的名称固定为4种, 不可变. 这是因为EventBus是同通过反射函数名在订阅类中查找订阅函数.
注意: 不要使用register(Object subscriber, String methodName, ...)注册自定义名称的订阅函数, 在2.2版本中已经被Deprecated了.
订阅函数分为 onEvent, onEventMainThread, onEventBackground, onEventAsync.
订阅函数必须是public, 且形参个数必须只能是1个.(源代码中写死了...)
4种订阅函数之间存在差别.
... // Activity中关于AnyTypeEvent的订阅函数实现 public void onEvent(AnyTypeEvent event){ Toast.makeText(this, event.getSomeMsg(), Toast.LENGTH_SHORT).show(); } ...
4. 发布事件
btnOnEvent = (Button) findViewById(R.id.btn_act_main_on_event); btnOnEvent.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // 发布AnyTypeEvent类型的事件 EventBus.getDefault().post(new AnyTypeEvent("Button-onEvent is clicked.")); } });
5 四种订阅函数之间的区别.
它们之间的区别在于与post()函数相比较, 是在哪个线程运行订阅函数.
1) onEvent:
在哪个线程调用post(), 就在相同的线程执行onEvent().
2) onEventMainThread:
无论post()运行于哪个线程, 都在UI线程执行onEventMainThread().
3) onEventBackground:
如果post()运行在子线程, 则onEventBackground()也运行于子线程.
如果post()运行在UI线程, 则启动子线程运行onEventBackground()
4) onEventAsync:
无论post()运行于哪个线程, 都启动子线程执行onEventAsync()
针对性的选择使用订阅函数,可以避免在线程切换时引发的消耗.
在使用onEvent, onEventMainThread, onEventBackground时, 务必保证在函数内不要去执行耗时操作, 避免其阻塞了UI线程.