24

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

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

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

4

4 回答 4

13

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

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

于 2015-03-24T15:36:49.727 回答
8

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

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

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

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

于 2016-06-05T22:18:48.677 回答
3

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

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

于 2015-04-21T20:31:23.043 回答
0

我找到的表单 EventBus文档,它对我来说很好用:

@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");
    }
}
于 2018-02-11T07:18:02.620 回答