Android 开发中的 Event Driven | Ross's Page

Android 开发中的 Event Driven

Why

Decoupling your Android code 这篇文章提到:

Android as a platform offers a lot of different components to be used around. In a single Activity you might find yourself with a stack of Fragments, Views, Model data, adapters, Action bar actions, View actions (click), context menus and more.
Aiming to combine them all in an elegant way that will guarantee you with flexible and modular code will require you to “decouple” them from each other. That way, you will have the opportunity to re-use them, and make future changes easier.

Decoupling Android App Communication with Otto 这篇文章中同样提到:

As Android applications increase in complexity, ensuring effective communication between different parts becomes more and more difficult.

In order to find an elegant solution to this problem, a technique is borrowed from an unexpected place: Swing applications. The event bus pattern—also known as message bus or publisher/subscriber model—allows for the communication of two components to occur without either of them being immediately aware of the other.

这两篇文章都指出在 Android 应用开发中,随着应用复杂度提高,模块增多,如果使用 ListenerBroadcastReceiver 以及只在应用内部传递信息的 LocalBroadcastReceiver 等组件间的通信方式,耦合度也会随之增大。为了降低代码的耦合度,使用 Event Bus 是很好的选择。

Event Bus 模式,也被称为 Message Bus 或者 publisher/subscriber 模型,相互通信的组件间无需知道对方的存在:

What

针对 Android 平台的 Event Bus 实现比较热门的有以下两个开源项目:

ottoGoogle guava 的基础上,适配了 Android 平台,提供了基于反射和 Annotation 的事件发布/订阅机制,默认工作在 Main UI 线程。

EventBus 基于反射和方法命名约定也提供了事件发布/订阅机制,但是针对 Android 平台提供了深度定制,支持 Sticky Event,并提供了多种工作线程模式,不再限制在 Main UI 线程。这篇文档 给出了详细的解释。Event Bus 官方提供了一个 实例 AppottoEvent Bus 的性能进行了比较,得出性能更好的结论,考虑到其提供了针对 Android 平台的更多功能,得到了更多开发者的青睐。

关于二者功能和性能的对比表

How

Otto

如果应用规模较小,且无需复杂线程间通信,otto 是个很好的选择,其使用 Annotation 让发布和订阅事件更方便,相比 Event Bus 依靠命名约定更不易出错。

otto 和传感器数据收集模块集成到 SDK 的工程已经提交到:xiaohui.wang/SensorDemo

由于 otto 的代码非常精简,规模很小,很容易读懂,EventBus vs Otto vs Guava 这篇文章参考其实现了一个更轻量级的 Event Bus,是很好的参考。

Vogella 网站有一个 End to End 的教程 全方位介绍了 otto 在项目中的使用

Event Bus

如果应用功能较多,组件间通信比较复杂,那么 Event Bus 是更好的选择,其提供的工作在不同线程的支持,并且有 Sticky Event,可以相当大程度高效替换 BroadcastReceiver,提供更安全和耦合度更低实现。(这篇文章 详细介绍了 Intentextra 可能存在的运行时类型安全隐患,特别是在项目规模较大,需要多人协作时可能造成的维护成本增加)。

下面两个系列博文对本文讨论的 Android 平台上的 Event Driven 模式都进行了深度讨论并提供了使用 Event Bus 进行解耦的实例项目,并且都给出了实例代码的 Github 链接:

Event Driven Architecture

Google Developer Experts Group 的这篇文章 用一个项目实例介绍了如何在 Android 应用程序开发中应用 Event Driven 模式,对应用功能进行模块化组织,使用 Event Bus 管理模块间信息传递从而达到解耦提高可扩展和可维护性的目的。

-- EOF --

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: Android 开发中的 Event Driven

comments powered by Disqus