在Android开发中,组件间通信一直是一个不可忽视的部分。当然,组件之间的通信有很多种方式可以选择,本文就利用EventBus通信的方式进行论述。
EventBus是一个第三方框架,它的简单使用分为如下几步:
1. 下载框架源码,并导入工程中。
下载地址:https://github.com/greenrobot/EventBus
如果需要看如何导入并依赖工程,请转到另一篇博文:《Eclipse导入所依赖的Android项目》
2. 定义事件类,并广播事件
例如下面这个自定义事件类MessageEvent
public class MessageEvent { public final String message; public MessageEvent(String message) { this.message = message; }}
EventBus通信也是基于事件的,写好事件类,然后你就可以用EventBus把你定义的事件广播出去,如:
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
3. 准备好事件接受者
通信嘛,其实本质上挺简单的,就是一个组件广播事件,然后另一个接收就OK了。我们在上一步已经介绍了如何广播事件,接下来就介绍最后一步,准备好事件接受者。其实准备好接收者挺简单的,EventBus并注册定义一个函数就OK了。举个例子,假如我们的一个接收者是Activity,那么代码就会有如下形式:
@Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override public void onStop() { EventBus.getDefault().unregister(this); super.onStop(); } public void onEvent(MessageEvent event){ Toast.makeText(getActivity(),event.message,Toast.LENGTH_SHORT).show(); } public void onEvent(SomeOtherEvent event){ doSomethingWith(event); }
代码中,EventBus.getDefault().register(this)和EentBus.getDefault().unregister(this);分别是EventBus的注册和反注册。在注册之后,代码中又定义了两个函数,onEvent(MessageEvent event)和onEvent(SomeOtherEventevent)。当我们调用EventBus.getDefault().post(new MessageEvent("Helloeveryone!"))时,所有已经完成EventBus注册并定义onEvent(MessageEvent event)的接收者将会接收到事件(准备好的接收者未必只有一个),并且相应接收者中的onEvent(MessageEvent event)将会被调用。如果我们调用EventBus.getDefault().post(newMessageEvent("Hello everyone!")),那么相应接收者的onEvent(SomeOtherEventevent)将会被调用,这个没什么好说的,就是一个Overload。至此,已经完成了“广播——接收”的过程,简单的通信已经完成。
以上只研究了简单通信过程,接下来对一些问题进行详细讨论。
1. ThreadModes
在上文我们说要在接收者中定义onEvent函数,其实我们未必非要定义onEvent,也可以选择其它函数,可选函数有如下4个:
public voidonEvent(MessageEvent event); publicvoid onEventMainThread(MessageEvent event); publicvoid onEventBackgroundThread(MessageEvent event); publicvoid onEventAsync(MessageEvent event);我们可以在这4个中选一个进行定义就可以了。到这里你可能要问,这4个函数有啥区别吗?当然,是有区别的,区别在于这四个函数运行时所在的线程,这就引出了EventBus的ThreadModes。
onEvent(MessageEventevent)和EventBus.post(Object object)运行在同一个线程中,也就是在哪个线程中广播的事件,就在哪个线程中运行onEvent(MessageEvent event)。
onEventMainThread(MessageEventevent)不管EventBus.post(Object object)是在哪个线程中调用的,都会在主线程中运行。当我们需要更新UI时,定义onEventMainThread(MessageEvent event)是再方便不过的了。
onEventBackgroundThread(MessageEventevent)和onEventMainThread(MessageEvent event)正相反,不管EventBus.post(Objectobject)是在哪个线程中调用的,都会在后台线程中运行。当我们在主线程中调用EventBus.post(Object object)时,onEventBackgroundThread(MessageEventevent)将会在一个新的线程中运行;相反,当我们在后台线程中调用EventBus.post(Object object)时,onEventBackgroundThread(MessageEventevent)将会运行在EventBus.post(Object object)线程中。
onEventAsync(MessageEventevent) 不管EventBus.post(Object object)是在哪个线程中调用的,都会在一个新线程中运行,该新线程一般是后台线程。
2.有序广播事件
EventBus.register(Objectsubscriber)还有另外一个重载形式EventBus .register(Object subscriber, intpriority),其中priority便是接受者的优先级,默认优先级为0。对于那些事件处理函数(即上文说过的那4个)将会运行在同一个线程中的接受者,将会按优先级从大到小的顺序接收事件。