19

我已经实现了一项服务,我在其中处理状态更改(连接、断开连接、onServiceDiscoverd、onCharacteristicChange 等)并通过 gatt 服务器从另一台设备接收数据。

我的问题是,是否可以使用Greenrobot Eventbus替换service 和 Activity 之间的广播接收器来有效处理事件?

4

3 回答 3

16

与 LocalBroadcastManager 不同,EventBus 使用起来更简单。您只需执行 3 个步骤:

1-创建一个事件类。一个简单的 Java 类,表示动作发生时的响应。

2-在您的 Activity onCreate 方法中将事件总线注册为订阅者

  EventBus.getDefault().register(this);

当然,在您的 Activity onDestroy 方法中取消注册它

 EventBus.getDefault().unregister(this);

3- 在为 EventBus 注册的同一活动中创建订阅方法。WorkOrderActivity 中的示例

   @Subscribe
    public void onEvent(EventClass event)

当事件发生时,你应该调用 post 方法,传递你之前创建的事件对象。

  EventBus.getDefault().post(new EventClass (Data));

正如 kmaini 所提到的,您可以将其替换为 LocalBroadcastManager,但您必须自己映射来自意图的数据。与可以传递对象的 EventBus 不同。

此外,EventBus 库的创建者 greenrobot在这里回答了这个问题:

Q: EventBus 与 Android 的 BroadcastReceiver/Intent 系统有什么不同?

A:与Android 的BroadcastReceiver/Intent 系统不同,EventBus 使用标准Java 类作为事件,并提供更方便的API。EventBus 旨在用于更多的用例,在这些用例中,您不想经历设置 Intent、准备 Intent extras、实现广播接收器和再次提取 Intent extras 的麻烦。此外,EventBus 的开销要低得多。

于 2016-04-25T13:34:54.543 回答
1

从另一个角度来看,我相信 Android 中的广播管理器使用主线程处理程序的消息队列来处理事件。因此,如果您可以自由地使用具有适当队列(例如使用另一个 HandlerThread)的不同线程(如果您没有 UI 事件/作业/任务),那么您可以利用该线程的特定队列来处理您的作业,不会干扰 UI 事件并将您的东西与 UI 工作混合。您还可以使用线程的优先级值来平衡工作。

现在,如果 GreenRobot 在几行代码中提供了所有功能,那么我肯定会尝试它来查看性能提升。

于 2016-11-15T11:11:49.073 回答
0

EventBus 使事情变得更容易,因为您可以在事件中传递任意 Java 对象。您不会这样做,Intents因为您的对象必须实现Parcelable,并且“乏味”的可打包实现是您可能不会在现有代码上执行的操作根据。

于 2016-10-09T12:43:39.840 回答