具有Activity / Fragment生命周期的EventBus行为

时间:2017-09-19 13:12:28

标签: android greenrobot-eventbus

我已经注册了我的活动/片段:

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

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

我有一个正在运行的流程,并将事件及其状态发布到我的订阅者方法。

例如,如果用户旋转设备,将调用onStop并且我的活动/片段将被取消注册,并且在再次注册之前它不会监听我的进程事件。

如果在这么短的时间内发布了一些事件,会发生什么?

(考虑到我的事件总线不会因为没有注册任何订阅者而引发任何异常。)

我真的很想处理这样的情况,因为某些原因,活动/片段没有注册,一些活动正在发布。

我正在考虑实现订阅者未收到的事件队列,以便在再次注册时,UI可以对其进行处理。

2 个答案:

答案 0 :(得分:1)

您需要在onCreate()中注册并在onDestroy()中取消注册,如下所示:

@Override 
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  ...
  // Check if Event Bus is not already register here
  if (!EventBus.getDefault().isRegistered(this)) {
        EventBus.getDefault().register(this);
     }
  ...
}

@Override 
protected void onDestroy() {
  // Check if Event Bus is register here, then unregister it.
  if (EventBus.getDefault().isRegistered(this)) {
      EventBus.getDefault().unregister(this);
     }
  super.onDestroy();
}

答案 1 :(得分:0)

您有两种类型的活动: - 表示事情发生并且之后并不真实相关的事件。例如:汽车速度变为50公里/小时 - 其他更像国家的人。例如,汽车发动机已关闭。

如果发布第一种类型的事件,通常不会错过很多,因为将会有另一个将取代旧值(即速度变为30 km / h)。 对于第二种类型的事件,您可能想要知道最后一个值(或状态),因为它可能不会很快再次更改。 (通过上面的例子,你想知道你是否错过了发动机关闭或打开的事件,以便做/显示具体的事情)

此第二类事件通常以粘性形式处理,您可以使用postSticky()registerSticky()方法。 因此,如果您的活动以粘性形式发布,则在致电registerSticky()后,您将收到有关其最后一次价值的所有粘性事件的通知。

如果每个事件的最后一个值不够,那么您可能需要手动缓存错过的事件。