使用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线程.