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

时间: 2024-12-09 10:41:21

Android组件间通信——EventBus的相关文章

Android组件间通信框架EventBus

事件总线EventBus模式概述 在不使用事件总线的情况下: 在应用中的多个地方,控件经常需要根据某个状态来更新他们显示的内容.这种场景常见的解决方式就是定义一个接口,需要关注该事件的控件来实现这个接口.然后事件触发的地方来注册/取消注册这些对该事件感兴趣的控件.例如,陌陌依赖手机位置信息来获取附近的用户,所以在位置更新管理器(MmLocationManager)中定义了一个接口来监听位置更新的事件(MmLocationListener): interface MmLocationListene

Android 组件间通信--事件驱动

在android中,组件间通信常用的方式: 1.使用广播机制:在主页面中监听特定的广播事件,进行业务逻辑的操作,其他页面只需要根据需求发送广播即可 例如:常用app结构中,左边通常为菜单栏,点击菜单栏,中间页面变化.当点击菜单时发送广播通知容器变化显示的Fragment 2.使用接口方式:activity实现特定的接口,在子类或者Fragment中获取到Activity对象,转换成特定的接口对象,调用接口方法 3.事件驱动方式:EventManager 最近在网上看到EventBus这个开源的工

【Android高级】Android组件间通信库EventBus学习

最近偶然在论坛上看了一个比较厉害的库EventBus,感觉使用起来很爽,不用考虑在Activity还是Fragment,不用担心是不是UI线程,随便怎么通信都行,有网友笑说这简直是Android开发中的第五大组件,通信起来像广播那样神通,但又比广播轻量级多了,所以在这里记下来,以后开发就方便多了. 项目地址:https://github.com/greenrobot/EventBus EventBus主要特点 1. 事件订阅函数不是基于注解(Annotation)的,而是基于命名约定的,在And

Android组件间通信库EventBus学习

项目地址: https://github.com/greenrobot/EventBus EventBus主要特点 1. 事件订阅函数不是基于注解(Annotation)的,而是基于命名约定的,在Android 4.0之前的版本中,注解解析起来比较慢 , 事件响应函数默认以“onEvent”开始,可以在EventBus中修改这个值,但是不推荐这么干2. 事件响应有更多的线程选择EventBus可以向不同的线程中发布事件,在ThreadMode 枚举中定义了4个线程,只需要在事件响应函数名称“on

android组件间通信又一种方式

createPendingResult(int requestCode, Intent data, int flags) 参数说明 int requestCode 请求码,相当于startActivityForResult的请求码 Intent data 默认结果,相当于setResult的data int flags 标志位,不太明白,老朽传了个0 这个Activity的方法作用是,得到一个PendingIntent,在任意地方,用来回调创建此意图的Activity的onActivityRes

Vue2.0 实战项目(五) 组件间通信的方法

Vue组件之间通信分为三种情况:父组件向子组件通信.子组件向父组件通信.兄弟组件间通信. 一.父组件向子组件通信 通过props可以将值传递给子组件 <!-- 父组件 --><template> <div id="app"> <!-- 父子组件间通信 --> <child :message="toChildMsg"></child> </div> </template>

Vue 组件间通信有哪几种方式?

父子通信 (1)父组件向子组件传值props <button-counter :title="send"></button-counter> Vue.component('button-counter', { props: ['title'], data: function() { return { count: 0 } }, 子向父通信 (2)子组件向父组件传值  $emit('enlarge-text',10)   on 子组件通过自定义事件向父组件传递数据

Android组件间的相互调用

我们研究两个问题,1.Service如何通过Broadcaster更改activity的一个TextView.(研究这个问题,考虑到Service从服务器端获得消息之后,将msg返回给activity) 2.Activity如何通过Binder调用Service的一个方法.(研究这个问题,考虑到与服务器端交互的动作,打包至Service,Activity只呈现界面,调用Service的方法) 结构图见如下:效果图如下:点击“start service”按钮,启动Service,然后更改Activ

React独立组件间通信联动

React是现在主流的高效的前端框架,其官方文档 http://reactjs.cn/react/docs/getting-started.html 在介绍组件间通信时只给出了父子组件间通信的方法,而没有给出独立组件间通信的解决方案.这里我介绍一种不错的实现方式——signals. 第一步,我们要建立两个简单的react组件——一个进度条和一个输入框. 组件——进度条: var ProcessBar=React.createClass({ getInitialState:function(){