哪些 Activity 生命周期方法最适合 register/unregister 事件总线?

Which Activity lifecycle methods are best to register/unregister to event bus?

注册取消注册到事件总线(如otto、EventBus或tinybus)的最佳位置是Activity 为什么?

  1. onCreate()-onDestroy()
  2. onStart()-onStop()
  3. onResume()-onPause()

Otto 的示例使用了 onResume()-onPause(),EventBus 提到了 onStart()-onStop(),我们需要在我们的应用中使用 onCreate()-onDestroy() 来更新 activity' s UI 即使它在后台。 所以我猜它可以是这三个中的任何一个,具体取决于事件的性质及其处理方式,但我想知道是否还有其他需要考虑的地方。

首先,这不是一个 objective 问题,而是一个主观问题,并且会根据论点得出很多论点。

根据我的经验, 我们在一个项目中使用了 Otto。我们遵循 onResume()-onPause() 这对我们非常有用。这也是有道理的,因为我们应该在使用事件总线时尽可能晚地注册并尽快注销。

我在上面的回答中删除了我的评论,即最好在 onresume/onpause 中注册/取消注册。我有一个奇怪的用例,如果我的事件没有到达带注释的订阅者。似乎最好的方法是使用onstart/onstop。这是一个很好的 SO post 解释原因:

@levavare,我认为 register/unregister 的正确时间取决于您的活动以及您打算如何处理这些活动。并且对于同一应用程序中的不同事件可以不同。

例如,我在 Android 应用程序中使用 EventBus,该应用程序通过蓝牙监控实时数据记录设备(在本例中为 Arduino)。我有两种截然不同的事件。

第一个事件由我的蓝牙代码发布,通知我的一个片段已从设备接收到一组新的仪器读数。然后该片段将它们写入数据库 table。重要的是要始终听到事件并采取行动。片段 registers/unregisters 在其 OnCreate/OnDestroy 方法中。我还以更高的优先级订阅了该事件。

另一个事件是当新记录被添加到数据库时由数据库层发布的。我有一系列片段显示不同的读数子集(温度、压力、警报条件)。当其中一个片段被查看时,它应该在新读数进入数据库后立即更新。但是当片段不在视线范围内时,它就没有理由对读数采取行动。我在 OnStart/OnStop 中有那些片段 register/unregister。我打算在 OnResume/OnPause 中完成这项工作,坦率地说,我认为它也适用于我的应用程序。但是@Jordy 的回答和 link 说服我改用 OnStart/OnStop。

Form EventBus Documentation that I found and it's works fine for me:

@Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }

 @Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }

And if you need to send the EventBus reference to the child then:

private EventBus eventBus = EventBus.getDefault();
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        .......
}

@Override
public void onStart() {
    super.onStart();
    if(!eventBus.isRegistered(this)){
        eventBus.register(this);
    }else{
        Log.e(TAG, "EventBus is registered");
    }
}

@Override
public void onStop() {
    super.onStop();
    if(eventBus.isRegistered(this)){
       eventBus.unregister(this);
    }else{
       Log.e(TAG, "EventBus is not registered");
    }
}