我已经实现了一项服务,我在其中处理状态更改(连接、断开连接、onServiceDiscoverd、onCharacteristicChange 等)并通过 gatt 服务器从另一台设备接收数据。
我的问题是,是否可以使用Greenrobot Eventbus替换service 和 Activity 之间的广播接收器来有效处理事件?
我已经实现了一项服务,我在其中处理状态更改(连接、断开连接、onServiceDiscoverd、onCharacteristicChange 等)并通过 gatt 服务器从另一台设备接收数据。
我的问题是,是否可以使用Greenrobot Eventbus替换service 和 Activity 之间的广播接收器来有效处理事件?
与 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 的开销要低得多。
从另一个角度来看,我相信 Android 中的广播管理器使用主线程处理程序的消息队列来处理事件。因此,如果您可以自由地使用具有适当队列(例如使用另一个 HandlerThread)的不同线程(如果您没有 UI 事件/作业/任务),那么您可以利用该线程的特定队列来处理您的作业,不会干扰 UI 事件并将您的东西与 UI 工作混合。您还可以使用线程的优先级值来平衡工作。
现在,如果 GreenRobot 在几行代码中提供了所有功能,那么我肯定会尝试它来查看性能提升。
EventBus 使事情变得更容易,因为您可以在事件中传递任意 Java 对象。您不会这样做,Intents
因为您的对象必须实现Parcelable
,并且“乏味”的可打包实现是您可能不会在现有代码上执行的操作根据。