当前位置: 代码迷 >> Android >> Android组件间通讯——EventBus
  详细解决方案

Android组件间通讯——EventBus

热度:115   发布时间:2016-04-28 00:47:20.0
Android组件间通信——EventBus

    在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个)将会运行在同一个线程中的接受者,将会按优先级从大到小的顺序接收事件。







  相关解决方案