我已经实现了一个服务,我处理状态更改(连接,断开连接,onServiceDiscoverd,onCharacteristicChange等)并通过gatt服务器从另一个设备接收数据。
我的问题是,可以使用有效处理事件 Greenrobot Eventbus 取代广播接收器 服务和活动之间?
我已经实现了一个服务,我处理状态更改(连接,断开连接,onServiceDiscoverd,onCharacteristicChange等)并通过gatt服务器从另一个设备接收数据。
我的问题是,可以使用有效处理事件 Greenrobot Eventbus 取代广播接收器 服务和活动之间?
与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回答了这个问题 这里:
问:EventBus与Android的BroadcastReceiver / Intent有何不同 系统?
答:与Android的BroadcastReceiver / Intent系统不同,EventBus使用 标准Java类作为事件,并提供更方便的API。 EventBus适用于您不需要的更多用例 想要经历设置Intent的麻烦,准备Intent 附加功能,实现广播接收器和提取意图 额外的。此外,EventBus的开销要低得多。
以下是我实施LocalBroadcast时所遵循的链接:
https://stackoverflow.com/a/8875292/4406743
以下是我的实施摘要:
在接收活动或服务中:
1)注册本地braodcast(通常在onCreate):
LocalBroadcastManager.getInstance(this).registerReceiver(
mMessageReceiver, new IntentFilter("broacast_name"));
2)取消注册本地广播(通常是onDestroy):
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
3)定义广播接收器:
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//Handle local broadcast
}
};
在发送活动或服务中:
Intent it = new Intent("broacast_name");
it.putExtra("data", "value");
LocalBroadcastManager.getInstance(context).sendBroadcast(it);
从另一个角度来看,我相信Android中的广播经理使用主线程处理程序的消息队列来处理事件。因此,如果您可以使用具有适当队列的其他线程(如果您没有UI事件/作业/任务)(例如使用另一个HandlerThread),那么您可以利用该线程的特定队列来处理您的作业,不干扰UI事件,并将您的东西与UI工作混合在一起。您还可以使用线程的优先级值来平衡工作。
现在,如果GreenRobot在几行代码中提供了所有功能,那么我肯定会尝试看到任何性能提升。
EventBus使事情变得更容易,因为你可以在事件中传递任意Java对象。你不会这样做 Intents
因为你的对象必须实现 Parcelable
以及“乏味”的可分配实现,这可能是您在现有代码库中无法执行的操作。