我已经注册了我的活动/片段:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
我有一个正在运行的流程,并将事件及其状态发布到我的订阅者方法。
例如,如果用户旋转设备,将调用onStop并且我的活动/片段将被取消注册,并且在再次注册之前它不会监听我的进程事件。
如果在这么短的时间内发布了一些事件,会发生什么?
(考虑到我的事件总线不会因为没有注册任何订阅者而引发任何异常。)
我真的很想处理这样的情况,因为某些原因,活动/片段没有注册,一些活动正在发布。
我正在考虑实现订阅者未收到的事件队列,以便在再次注册时,UI可以对其进行处理。
答案 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()
后,您将收到有关其最后一次价值的所有粘性事件的通知。
如果每个事件的最后一个值不够,那么您可能需要手动缓存错过的事件。