EventBus行为与活动/碎片生命周期



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

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

我有一个正在运行和发布其状态的事件的过程。

例如,如果用户旋转设备,将调用onstop,并且我的活动/片段将未注册,并且不会收听我的过程事件,直到它再次注册为止。

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

(考虑到我的活动总线不会因为没有任何子柜员注册而抛出任何例外。)

当活动/片段未注册并且某些事件发布时,我真的很想处理这样的情况。

我正在考虑实施订户未收到的事件的队列,以便在再次注册时可以对其进行整理。

您需要在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();
}

您有两种类型的事件: - 那些信号表明某事发生并且以后并不相关的人。例如:汽车速度变为50 km/h - 其他更像状态的人。例如,汽车引擎已关闭。

如果发布了第一种类型的事件,通常会错过一件大事,因为会有另一个可以替换旧值(即速度变为30 km/h)。对于第二种类型的事件,您可能想知道最后一个值(或状态),因为它可能不会很快再次改变。(在上面的示例中,您想知道是否错过了引擎已关闭或打开的事件,以进行/显示特定的事情)

这第二种事件通常被称为粘性,您使用postSticky()registerSticky()方法。因此,如果您的事件被发布为粘性,请致电registerSticky()后,您将获得所有带有其最后一个值的粘性事件的通知。

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

最新更新