简介

EventBus是一个很棒的事件订阅与发布的框架,项目地址:https://github.com/greenrobot/EventBus。

作用

Android各个组件间的以接口的方式进行的通信问题:

1 增加了组件间的耦合,某个组件的修改可能会引起另一个组件的修改,因此灵活度不高。
2 充斥着大量样板话的代码:
定义接口和回调
管理监听器
在各个层之间传递调用链

Android中,常见组件间的交互关系如下图所示:
实例讲解EventBus for Android_第1张图片
下面以list/details场景来说明组件间的通信问题。我们开发的app中有时会有这样一个需求:点击ListFragment中的某一项,DetailFragment展示对应的数据,组件间的关系如下图所示:
实例讲解EventBus for Android_第2张图片
实现上述需求对应的代码如下:
DetailFragment中定义函数:

//函数定义好了,如何被调用?public void loadDetails(Item items) {    ...}

ListFragment中定义接口:

interface Contract {    void onItemSelected(Item item);}//传递到Activity中((Contract)getActivity)).onItemSelected(item);

Activity实现接口:

public class MyActivity implements ListFragment.Contract {    public void onItemSelected(Item item) {        DetailFragment detailFragment = (DetailFragment)getFragmentManager().        findFragmentBy...;        detailFrasgment.loadDetails(item);    }}

EventBus使组件间的通信变的更加简单,组件间通信如下图所示:
实例讲解EventBus for Android_第3张图片
EventBus由4个基本成分组成:发布者,订阅者,事件和总线。4者的关系如下图所示:
实例讲解EventBus for Android_第4张图片
基本用法

1 定义Event
public class MyEvent {}
2 订阅者注册
EventBus.getDefault().register(this);
3 发布事件
EventBus.getDefault().post(event);
4 接收事件
public void onEvent(MyEvent event);

EventBus的事件处理方法:onEvent

1 在注册订阅者时,EventBus扫描订阅者中的事件处理函数
2 命名约定:以onEvent开头,public, 无返回值,只有一个参数

当某个事件被发布,EventBus是通过参数类型来确定哪个订阅者响应事件的.

使用EventBus实现list/details场景

Step 1: 定义Event Class

public class ItemSelectedEvent {  public final Item item;  public ItemSelectedEvent(Item item) {    this.item = item;  }}

Step 2: ListFragment中发送事件

EventBus.getDefault().post(new ItemSelectedEvent(item));

Step 3: DetailFragment中处理事件

public void onEvent(ItemSelectedEvent event) {    ...}

[点击下载源码](http://download.csdn.net/detail/lmj623565791/8126089)

EventBus的线程模型

为何要定义事件模型?因为在Android的中线程的使用有以下的限制:

1 主线程不能被阻塞,UI的更新位于主线程,耗时操作如网络处理在后台线程
2 事件的发送和处理可能会位于不同线程

通过使用EvenBus的线程模型,我们可以定义处理事件的线程类型。EventBus中有四种线程模型:PostThread,MainThread,BackgroundThread,Async,下面分别介绍之。
PostThread
默认的线程模型,事件发布和接收在相同的线程,适合用于完成时间非常短的任务,以免阻塞UI。例:

// Called in the same thread (default)public void onEvent(MessageEvent event) {    log(event.message);}

MainThread
订阅者的事件处理方法在主线程被调用,适合处理开销小的事件,以免阻塞主线程。例:

// Called in Android UI's main threadpublic void onEventMainThread(MessageEvent event) {    textField.setText(event.message);}

BackgroundThread
订阅者的事件处理在后台被调用。若事件发送线程位于主线程,EventBus将使用一个后台线程来逐个发送事件。

// Called in the background threadpublic void onEventBackgroundThread(MessageEvent event){    saveToDisk(event.message);}

Async
事件处理位于一个单独的线程,该线程往往既不是发送事件的线程,也不是主线程。使用这个模型适用于事件发送无需等待事件处理后才返回,适合处理耗时操作,如请求网络。EventBus内部使用线程池来管理多个线程。例:

// Called in a separate threadpublic void onEventAsync(MessageEvent event){    backend.send(event.message);}

小结:

本文介绍了EventBus的功能和用法,在接下来一篇文章EventBus for Android 源码分析中,我将介绍EventBus的实现原理和内部数据结构。

更多相关文章

  1. Android 性能典范-线程
  2. Android输入法框架分析(1)-三大组件
  3. Android 自定义组件02
  4. android 中java编程的意外事件处理
  5. android 线程池
  6. Android 关于异常与线程
  7. Android 事件总线OTTO用法快速入门
  8. 分享一款android的日历组件

随机推荐

  1. android wrapper C调用java api
  2. Android跨进程通信IPC之11——Binder驱动
  3. android上传图片至服务器
  4. Android导出Kml
  5. minSdkVersion,targetSdkVersion,maxSdkVer
  6. Android开发学习---使用Intelij idea 13.
  7. android画图——Path()的使用
  8. 坑爹的android碎片化
  9. Android 中自定义View(二)
  10. linux mint 17编译android 2.3.1错误记录