用Greenrobot Eventbus替换广播接收器以触发基于事件的function和从服务到活动的数据传输是否合适?

我已经实现了一个服务,我处理状态更改(连接,断开连接,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 Library的创建者greenrobot 在这里回答了这个问题:

问:EventBus与Android的BroadcastReceiver / Intent系统有何不同?

答:与Android的BroadcastReceiver / Intent系统不同,EventBus使用标准Java类作为事件,并提供更方便的API。 EventBus适用于更多用例,您不希望经历设置Intent,准备Intent附加function,实现广播接收器以及再次提取Intent附加function的麻烦。 此外,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在几行代码中提供了所有function,那么我肯定会尝试看到任何性能提升。

EventBus使事情变得更容易,因为你可以在事件中传递任意Java对象。你不要对Intents做同样的事情,因为你的对象必须实现Parcelable和“乏味”的parcelable实现,这是你可能不会做什么的现有代码库。