Eventbus 3官方文档翻译(一)
eventbus3的使用(3 steps)
- Define events(定义事件) 事件定义只是使用POJO(普通旧式的java对象),没有其他的要求;
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
- Prepare subscribers(准备订阅者) 写事件处理方法,当post同类型的事件,事件处理方法就会被回调,不用像使用eventbus2那样,书写方法时使用命名约定,在eventbus3中方法命名可以随意(EventBus 3 the method name can be chosen freely ),只要在方法上面加上@Subscribe 注解
// This method will be called when a MessageEvent is posted (in the UI thread for Toast)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
// This method will be called when a SomeOtherEvent is posted
@Subscribe
public void handleSomethingElse(SomeOtherEvent event) {
doSomethingWith(event);
}
注册订阅者(register Subscribers),订阅者只有注册完自己,它们才可以接收post事件,在android中,activity和fragment注册订阅者需要根据自己的生命周期,在大多数情况下,在onStart/onStop回调方法中注册就可以了
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
- Post events(post事件) 可以在代码的任何地方post事件,只有事件类型匹配的订阅者才会接收的事件;
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
Delivery Threads (线程间分发)
EventBus可以自己处理线程的关系,post事件的线程与事件处理的线程可以是不同的线程;
- ThreadMode: POSTING
订阅者将会在与post event同一个线程中回调,当事件post完毕后,就会回调事件处理方法(订阅者),这是默认的thread mode,没有线程间的分发,所以消耗资源较小,对于简单的、较快完成、不要求主线程的tasks,这是推荐的thread mode,事件处理方法需要快速的完成,返回结果,避免阻塞posting thread,posting thread 也有可能是主线程;
// 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线程)回调,如果post 事件的线程是在主线程中,事件处理方法会被直接的回调,事件处理方法需要快速的完成,返回结果,避免阻塞main thread;
// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
textField.setText(event.message);
}
- ThreadMode: BACKGROUND
订阅者将会在background thread 线程中回调,如果发送事件的线程(posting thread)不是在main thread中,事件处理方法将会在posting thread中直接被回调,如果posting thread线程是在主线程中,eventbus使用一个background thread 来处理事件,事件处理方法需要快速的完成,返回结果,避免阻塞background thread;
// Called in the background thread
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
saveToDisk(event.message);
}
- ThreadMode: ASYNC
每个事件处理方法回调在单独的线程中,事件处理的线程总是独立于posting thread和main thread,posting事件不会等待事件处理方法完成,如果事件处理方法执行耗时、网络访问时,需要使用这个模式,为了避免同时存在大量的异步处理方法线程,eventbus限制了并发处理线程的数量,eventbus使用线程池来有效地重用线程;
// Called in a separate thread
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
backend.send(event.message);
}
如有不妥的地方,欢迎留言指出。。。