Android组件间通信框架EventBus
事件总线EventBus模式概述
interface MmLocationListener { void onLocationChanged(Location location); }
然后在应用的各个需要响应该事件的地方来实现上面的接口,然后在位置更新管理器(MmLocationManager)中注册/取消注册事件监听接口的实现类:
mLocationManager.get().register(this);上面的解决方案是没问题的,但是不是理想方案。每个控件实现这个接口,导致这些控件和位置管理器注册强耦合在一起。这还意味着,当单元测试的时候,您需要模拟(mocked)位置管理器来生成位置更新事件。
随着应用功能的增加,需要监听的事件越来越多,而越来越多的控件需要监听不同的事件,则导致越来越多的控件需要注册到各种事件管理器上:
// 代码开始变得无法控制… mLocationManager.get().register(this); userAuthenticator.get().register(this); settingsManager.get().register(this); syncManager.get().register(this); configurationMonitor.get().register(this);注册和取消注册这些事件慢慢的会变得越来越难以管理。导致测试越来越困难,并将导致开发者的效率越来越低,同时在您的应用中越来越容易引入各种奇怪的Bug。
和需要注册各个事件的监听器相比,一个组件现在只用在Event Bus上注册一次即可:
bus.register(this);上面的注册告诉Event Bus我们现在希望接收各个事件的更新。 然后Bus检测该类中每个带有@Subscribe注解的函数,当相关的事件发生的时候就调用这些带有注解的函数。
上面示例中的位置监听功能,不用实现位置监听接口和里面的函数了,只需要提供一个带有@Subscribe注解的函数即可:
@Subscribe public void locationChanged(LocationChangedEvent event) { // TODO React to location change. }现在Event Bus会把所有的LocationChangedEvent 事件都发送给上面的函数。现在 MmLocationManager 类不用注册监听器了,当位置改变的时候 只需要向Event Bus发布事件即可:
bus.post(new LocationChangedEvent(37.892818, -121.772608));这样 组件间相互解耦了,而单元测试也变得简单了。任何事件都可以发布给Event Bus,然后Event Bus会找到对该事件感兴趣的函数来调用。
注意:您也许已经发现该模式在Android上层也存在 — Intent系统就是这样设计的!
- 不用再编写众多监听器接口,直接使用注解到方法。
- 不用再编写监听器注册/取消注册的管理类,取而代之的是EventBus这个同意的事件总线。
- 不用再对事件进行注册或者取消注册。事件总线会在事件被发布之后调用所有对它感兴趣的方法。
- 通过事件总线这个中介通信的双方实现了解耦。
- Otto是Square公司在他们应用中使用的Event Bus实现。从Guava中演变而来,并且专注于Android平台。
- EventBus 是greenrobot 出品的另外一个Event Bus类库,功能稍微多一点。本文将以EventBus类库为例进行学习。
EventBus最简洁,Otto最符合Guava EventBus的设计思路, BroadcastReceiver最难使用。第一选择是EventBus。
Android EventBus类库介绍
- Event:事件
- Subscriber:事件订阅者,接收特定的事件
- Publisher:事件发布者,用于通知Subscriber有事件发生
- 如果是PostThread,直接执行
- 如果是MainThread,判断当前线程,如果本来就是UI线程就直接执行,否则加入`mainThreadPoster`队列
- 如果是后台线程,如果当前是UI线程,加入`backgroundPoster`队列,否则直接执行
- 如果是Async,加入`asyncPoster`队列
- 定义事件类型:public class MyEvent {}`
- 定义事件处理方法:public void onEventMainThread`
- 注册订阅者:EventBus.getDefault().register(this)`
- 发送事件:EventBus.getDefault().post(new MyEvent())`
同一类型的事件只保存最新的Event对象。注册和发布事件的函数分别为 registerSticky(…) 和 postSticky(Object event).
http://www.cnblogs.com/angeldevil/p/3715934.html
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。