使用Event Bus模式解耦Android App组件间通信
2013-12-05 20:20
399 查看
场景描述
当一个Android应用功能越来越多的时候,保证应用的各个部分之间高效的通信将变得越来越困难。在应用中的多个地方,控件经常需要根据某个状态来更新他们显示的内容。这种场景常见的解决方式就是定义一个接口,需要关注该事件的控件来实现这个接口。然后事件触发的地方来注册/取消注册这些对该事件感兴趣的控件。
例如,陌陌依赖手机位置信息来获取附近的用户,所以在位置更新管理器(MmLocationManager)中定义了一个接口来监听位置更新的事件(MmLocationListener):
帮助
帮助
帮助
问题
上面的解决方案是没问题的,但是不是理想方案。每个控件实现这个接口,导致这些控件和位置管理器注册强耦合在一起。这还意味着,当单元测试的时候,您需要模拟(mocked)位置管理器来生成位置更新事件。随着应用功能的增加,需要监听的事件越来越多,而越来越多的控件需要监听不同的事件,则导致越来越多的控件需要注册到各种事件管理器上:
帮助
注册和取消注册这些事件慢慢的会变得越来越难以管理。导致测试越来越困难,并将导致开发者的效率越来越低,同时在您的应用中越来越容易引入各种奇怪的Bug。
解决方案
为了找出该问题的优雅解决方案,从一个意想不到的的地方借鉴点经验 — Swing应用。 Event Bus模式 — 也被称为Message Bus或者发布者/订阅者(publisher/subscriber)模式 — 可以让两个组件相互通信,但是他们之间并不相互知晓。和需要注册各个事件的监听器相比,一个组件现在只用在Event Bus上注册一次即可:
帮助
上面示例中的位置监听功能,不用实现位置监听接口和里面的函数了,只需要提供一个带有@Subscribe注解的函数即可:
帮助
现在 MmLocationManager 类不用注册监听器了,当位置改变的时候 只需要向Event Bus发布事件即可:
帮助
注意:您也许已经发现该模式在Android上层也存在 — Intent系统就是这样设计的!
下面介绍两个Android系统的Event Bus模式类库。
Otto — Android系统的Event Bus类库
Otto是Square公司在他们应用中使用的EventBus实现。从Guava中演变而来,并且专注于Android平台。
通过使用Otto,Square公司的应用组件间不紧密耦合了,单元测试也更加容易了。
您可以通过Otto项目的主页来了解更多内容或者查看Otto项目的源代码。
EventBus — Android系统的Event Bus类库
EventBus 是http://greenrobot.de 出品的另外一个EventBus类库,功能稍微多一点。
在后面的文章中将会分别介绍如何使用Otto和EventBus。
Read more: http://blog.chengyunfeng.com/?p=449#ixzz2mbPmvzb3
相关文章推荐
- 使用Event Bus模式解耦Android App组件间通信
- 使用Event Bus模式解耦Android App组件间通信
- 使用Event Bus模式解耦Android App组件间通信
- 使用Event Bus模式解耦Android App组件间通信
- 【android】使用Event Bus模式解耦Android App组件间通信
- Android 桌面小组件AppWidget的使用
- 一文详尽 Android 通信:四大组件之间 & 进程间 & 线程间 & 多个App间
- android 桌面组件 App widget的使用
- Android的桌面组件App Widget的使用方法 AppWidgetProvider RemoteViews
- Top Android App使用的组件(2)
- Android 使用AIDL实现了两个app之间的通信
- Android学习-使用单例模式实现一键退出APP
- Top Android App使用的组件(3)
- App 组件化/模块化之路——Android 框架组件(Android Architecture Components)使用指南
- Top Android App使用的组件(四)
- Top Android App使用的组件 3
- Android跨组件通信——TheWatcher使用介绍
- Top Android App使用的组件(一)
- Android,xml组件属性style的使用,自定义适配器(含持有者模式)
- Top Android App使用的组件 2