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

问题描述 投票:16回答:4

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

我的问题是,使用Greenrobot Eventbus在服务和活动之间替换广播接收器可以有效地处理事件吗?

android android-service bluetooth-lowenergy android-broadcast greenrobot-eventbus
4个回答
13
投票

与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回答了这个问题here

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

答:与Android的BroadcastReceiver / Intent系统不同,EventBus使用标准Java类作为事件,并提供更方便的API。 EventBus适用于更多用例,您不希望经历设置Intent,准备Intent附加功能,实现广播接收器以及再次提取Intent附加功能的麻烦。此外,EventBus的开销要低得多。


1
投票

以下是我实施LocalBroadcast时所遵循的链接:

https://stackoverflow.com/a/8875292/4406743

以下是我的实施摘要:

在接收活动或服务中:

1)注册本地广播(通常在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);

1
投票

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.