Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK

在安卓App内使用EventBus进行通信

by
Read Time:6 minsLanguages:

Chinese (Simplified) (中文(简体)) translation by Zuojianzifu 作茧自缚 (you can also view the original English article)

典型的Android应用程序通常由许多层,模块或结构(如片段,活动,演示者和服务)组成。 如果它们紧密耦合在一起,这些组件之间的有效通信可能变得困难。

在应用程序架构的较低级别(如数据库)发生操作时,可能需要将数据发送到更高级别(如视图)。 为此,您可能需要创建一个监听器接口,异步任务或回调。 所有这些都会奏效,但它们有一些主要的缺点:

  1. 直接或紧耦合
  2. 单独注册和取消注册多个依赖关系
  3. 代码重复
  4. 测试困难
  5. 错误增加的风险

使用发布/订阅或消息总线架构可防止上述突出显示的所有潜在问题。 在应用程序中实现组件之间的有效通信是一种非常好的方式,而不需要立即注意其他组件。 在Android中使用发布/订阅,任何应用程序组件都可以发布将其移交给总线的事件,相关消费者可以使用或订阅它们。

要使用greenrobot EventBus,您需要首先将其添加到应用程序模块build.gradle文件中,包括编译org.greenrobot:eventbus:3.0.0,然后再同步您的项目。

事件订阅者

订阅者仅仅通过在事件总线中注册来订阅事件,并且还可以注销该事件。 要做订阅者,你必须做三件事:

1.通过register()在事件总线中注册订阅者。 这通知事件总线您想要开始接收事件了。 在一个活动中,在onStart()方法中进行注册,或者在一个片段中将其放在onAttact(Activity activity)方法中。

2.注销订阅者,这意味着告诉事件总线停止发送订阅的事件。 在一个活动中,是在onStop()方法中进行注销,而在一个片段中将其放在onDetach()方法中。

3.实现onEvent()来指示您期望收到的事件的类型以及收到事件时采取的操作。 请注意此方法顶部的@Subscribe注释。 在这种情况下,我们想订阅一个正常的事件,而不是一个粘性的事件 - 我将在之后解释其中的差异。

定义事件消息

您定义的对象就是在greenrobot EventBus中的事件。 如果你愿意,你可以有不同的事件类。 他们不继承任何基类或接口 - 它们只是POJO(普通Java对象)。

发布事件和发布粘性事件

一般事件和粘性事件之间的主要区别是事件总线内部使用的缓存机制。 当发布粘性事件时,此事件存储在缓存中。 当一个新的活动或片段订阅事件总线时,它从缓存中获取最新的粘滞事件,而不是等待它再次被触发到事件总线,因此即使订阅者已经获得该事件,该事件也保留在缓存中。

粘滞事件使用postSticky(MessageEvent)方法发布,类似的是非粘性事件使用Post(MessageEvent)方法发布。

通常如果没有找到订阅者,非粘性事件将被丢弃。 但是如果一个订阅者在后面进行订阅,那么该粘性事件将被缓存。

那么什么时候使用粘性事件呢? 如果您正在跟踪用户的位置,或简单的缓存数据,跟踪电池电量等,您可以使用粘性事件。

订阅粘性时间

要订阅粘性事件,请在@Subscribe注解中包含sticky = true。 这表示我们希望从缓存中收到一个类型为MessageEvent的粘性事件。

移除粘性事件

removeStickyEvent(Event)方法从缓存中删除粘性事件,removeAllStickyEvents()将删除所有粘性事件。

EventBus 线程模式

用户可以选择以下四种线程模式:posting,main,background和async。

Posting

这是默认值。 订阅者将在与发布事件相同的线程内被调用。 在@Subscribe注释中包含ThreadMode.POSTING是可选的。

Main

在这种线程模式中,无论事件在何处发布,订阅者都将在UI线程中接收事件。 如果想要使用时间的结果来更新UI元素那么就使用这种线程模式。

Background

在这种线程模式下,订阅者将在同一个线程中收到他们发布的事件,就像ThreadMode.POSTING一样。 不同之处在于,如果事件发布在主线程中,那么订阅者将会将它们放在后台线程上。 这样可以确保事件处理时不会阻塞应用的UI。 但是,不要在该线程运行需要很长时间的操作。

Async

在这种线程模式中,用户将始终独立于当前线程和主线程接收事件。 这使订阅者能够在单独的线程上运行。 这对于长时间运行的操作(如网络操作)非常有用。

订阅者优先级

如果要更改订阅者获取事件的顺序,则需要在注册期间指定其优先级。 具有较高优先级的用户在优先级较低的用户之前获取事件。 这只会影响同一线程模式下的用户。 注意,优先级默认为0。

取消事件

如果要阻止事件传递给其他订阅者,请在用户事件处理方法内调用cancelEventDelivery(Object event)方法。

结论

在本教程总,你学到以下:

  • greenrobot EventBus以及如何改善您的Android应用程序
  • 普通事件与粘性事件之间的区别
  • 不同的线程模式的区别以及何时使用
  • 订阅者优先级
  • 取消事件来停止接收事件

若要了解更多关于 greenrobot EventBus,我建议你去官方文档

您可以使用的另一个实现事件总线的库是RxAndroid。 在Envato Tuts +上查看我们关于RxAndroid的文章,或者尝试一些我们其他的Android课程或教程。

关注我们的公众号
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.