哪些Activity生命周期方法最适合注册/注销到事件总线?

时间:2015-03-24 15:31:09

标签: android otto greenrobot-eventbus

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

  1. 的onCreate() - 的onDestroy()
  2. 在onStart() - 的onStop()
  3. 的onResume() - 的onPause()
  4. Otto的示例使用onResume() - onPause(),EventBus提到onStart() - onStop(),我们需要在我们的应用程序中使用onCreate() - onDestroy()来更新活动的UI,即使它在背景。 所以我想它可以是三个中的任何一个,取决于事件的性质和它们的处理,但我想知道是否还有更多应该考虑的内容。

4 个答案:

答案 0 :(得分:13)

首先,它不是一个客观的问题,而是一个主观的问题,并会根据论点得出很多论据。

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

答案 1 :(得分:8)

@levavare,我认为注册/取消注册的正确时间取决于您的活动以及您打算如何处理它们。并且对于同一应用程序中的不同事件可以有所不同。

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

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

当新记录添加到数据库时,数据库层将发布另一个事件。我有一系列碎片显示读数的不同子集(温度,压力,报警条件)。当正在查看其中一个片段时,一旦新读数在数据库中,它就应该更新。但是当片段不在视线范围内时,没有理由让它在阅读中起作用。我在OnStart / OnStop中注册/取消注册这些片段。我打算在OnResume / OnPause上做这项工作,坦率地说,我认为它对我的应用程序也有效。但@Jordy的答案和链接让我确信要使用OnStart / OnStop。

答案 2 :(得分:3)

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

https://stackoverflow.com/a/19737191/2361947

答案 3 :(得分:0)

  

我找到的表格EventBus Documentation,它对我来说很好用:

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

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

如果您需要将EventBus引用发送给孩子,那么:

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");
    }
}