EventBus 3使用文档(一)

来源:互联网 发布:淘宝跟天猫的区别 编辑:程序博客网 时间:2024/06/08 03:41

在使用EventBus之前,请先确保EventBus已经被添加到你的项目中。添加方法(gradle):

compile 'org.greenrobot:eventbus:3.0.0'

点击查看:Javadoc文档

三步使用EventBus

步骤一:定义事件(Event)

事件应当用POJO(简单Java对象)对象定义,没有任何依赖要求。

public class MessageEvent {    public final String message;    public MessageEvent(String message) {        this.message = message;    }}

步骤二:准备好订阅者(Subscriber)

订阅者通过订阅方法(subscriber method)来处理发出的事件。他们需要用@Subscribe来定义(即在方法上加上该注解)。EventBus 3的订阅方法的名字可以随意取,而不像EventBus 2对名字有特定的要求。

// 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@Subscribepublic void handleSomethingElse(SomeOtherEvent event) {    doSomethingWith(event);}

写好订阅方法后,订阅者还需要把他们自己注册到EventBus中,当然合适的时候还要反注册。只有在注册后,订阅者才会收到事件。在Android的Activity和Fragment中,我们通常会根据他们的生命周期来注册。

@Overridepublic void onStart() {    super.onStart();    EventBus.getDefault().register(this);}@Overridepublic void onStop() {    EventBus.getDefault().unregister(this);    super.onStop();}

步骤三:发布事件

可以在项目的任何地方调用发布事件的方法,所有在那一刻已经注册并且匹配事件类型的订阅者都会收到该事件。

EventBus.getDefault().post(new MessageEvent("Hello everyone!"));

线程投递(线程模型)

EventBus可以为你处理线程相关问题,比如:事件处理和事件发送可以不在同一个线程上。一种常见的用法就是在处理UI的改变上。在Android系统中,UI必须在UI线程(主线程)操作,而网络与其他耗时操作却不能在主线程上做。EventBus可以帮你处理这些杂事,而不需要你自己使用AsyncTask等来处理线程切换。

线程模型1:POSTING(发布者线程)

订阅者会在发布事件所在的线程被执行。这是默认行为。事件分发会以这样的方式同步完成:所有的订阅者会在发布事件方法完成之前把事件处理完成(译者注:post方法执行完时,所有的订阅者也把事件都处理好了)。这个线程模型占用资源最少,因为它完全不需要线程切换。所以,我们将它作为推荐模式。这样一来,很多简单的任务都能在很短的时间内完成,而不需要等着切到主线程再去做。但是,使用这样的线程模型要求订阅方法能在很短的时间内完成,否则如果是主线程发布的事件,就会导致主线程堵塞。下面是一个例子:

// Called in the same thread (default)// ThreadMode is optional here@Subscribe(threadMode = ThreadMode.POSTING)public void onMessage(MessageEvent event) {    log(event.message);}

线程模型2:MAIN(主线程)

订阅者一定会在主线程(有时跟UI线程是一回事)被调用。如果发布事件的线程就是主线程,订阅方法会被直接调用(就像POSTING线程模型一样同步完成)。使用这种线程模型,要求订阅方法必须在很短的时间内完成,否则主线程必定会堵塞。例子:

// Called in Android UI's main thread@Subscribe(threadMode = ThreadMode.MAIN)public void onMessage(MessageEvent event) {textField.setText(event.message);}

线程模型3:BACKGROUND(后台线程)

订阅者会在后台线程被调用。如果发布事件的线程不是主线程,订阅方法就会被直接在发布事件的线程调用;如果发布事件的线程是主线程,EventBus会使用一个单独的后台线程依次调用订阅方法。使用这种线程模型时,订阅方法应该占用尽可能短的时间以防止阻塞后台进程(译者注:因为订阅方法是依次被调用的,前一个订阅方法不完成,后一个订阅方法就不会被调用)。

// Called in the background thread@Subscribe(threadMode = ThreadMode.BACKGROUND)public void onMessage(MessageEvent event){    saveToDisk(event.message);}

线程模型4:ASYNC(异步线程)

所有订阅方法会同时在单独的线程被调用。这通常是独立于发布事件的线程和主线程的。发布事件时绝不会等待订阅方法的完成。当需要消耗较长时间来完成一个订阅方法时,应该使用这种线程模型,比如网络访问。应当避免同时触发太多的长耗时操作来限制并发线程数量。EventBus使用了线程池来有效重用线程,已经完成了异步事件通知的线程会被回收利用起来。

// Called in a separate thread@Subscribe(threadMode = ThreadMode.ASYNC)public void onMessage(MessageEvent event){    backend.send(event.message);}
1 0