哪些 Activity 生命周期方法最适合 register/unregister 事件总线?
Which Activity lifecycle methods are best to register/unregister to event bus?
注册和取消注册到事件总线(如otto、EventBus或tinybus)的最佳位置是Activity 为什么?
- onCreate()-onDestroy()
- onStart()-onStop()
- onResume()-onPause()
Otto 的示例使用了 onResume()-onPause(),EventBus 提到了 onStart()-onStop(),我们需要在我们的应用中使用 onCreate()-onDestroy() 来更新 activity' s UI 即使它在后台。
所以我猜它可以是这三个中的任何一个,具体取决于事件的性质及其处理方式,但我想知道是否还有其他需要考虑的地方。
首先,这不是一个 objective 问题,而是一个主观问题,并且会根据论点得出很多论点。
根据我的经验,
我们在一个项目中使用了 Otto。我们遵循 onResume()-onPause() 这对我们非常有用。这也是有道理的,因为我们应该在使用事件总线时尽可能晚地注册并尽快注销。
我在上面的回答中删除了我的评论,即最好在 onresume/onpause 中注册/取消注册。我有一个奇怪的用例,如果我的事件没有到达带注释的订阅者。似乎最好的方法是使用onstart/onstop。这是一个很好的 SO post 解释原因:
@levavare,我认为 register/unregister 的正确时间取决于您的活动以及您打算如何处理这些活动。并且对于同一应用程序中的不同事件可以不同。
例如,我在 Android 应用程序中使用 EventBus,该应用程序通过蓝牙监控实时数据记录设备(在本例中为 Arduino)。我有两种截然不同的事件。
第一个事件由我的蓝牙代码发布,通知我的一个片段已从设备接收到一组新的仪器读数。然后该片段将它们写入数据库 table。重要的是要始终听到事件并采取行动。片段 registers/unregisters 在其 OnCreate/OnDestroy 方法中。我还以更高的优先级订阅了该事件。
另一个事件是当新记录被添加到数据库时由数据库层发布的。我有一系列片段显示不同的读数子集(温度、压力、警报条件)。当其中一个片段被查看时,它应该在新读数进入数据库后立即更新。但是当片段不在视线范围内时,它就没有理由对读数采取行动。我在 OnStart/OnStop 中有那些片段 register/unregister。我打算在 OnResume/OnPause 中完成这项工作,坦率地说,我认为它也适用于我的应用程序。但是@Jordy 的回答和 link 说服我改用 OnStart/OnStop。
Form EventBus Documentation that I found and it's works fine for me:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
And if you need to send the EventBus reference to the child then:
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");
}
}
注册和取消注册到事件总线(如otto、EventBus或tinybus)的最佳位置是Activity 为什么?
- onCreate()-onDestroy()
- onStart()-onStop()
- onResume()-onPause()
Otto 的示例使用了 onResume()-onPause(),EventBus 提到了 onStart()-onStop(),我们需要在我们的应用中使用 onCreate()-onDestroy() 来更新 activity' s UI 即使它在后台。 所以我猜它可以是这三个中的任何一个,具体取决于事件的性质及其处理方式,但我想知道是否还有其他需要考虑的地方。
首先,这不是一个 objective 问题,而是一个主观问题,并且会根据论点得出很多论点。
根据我的经验, 我们在一个项目中使用了 Otto。我们遵循 onResume()-onPause() 这对我们非常有用。这也是有道理的,因为我们应该在使用事件总线时尽可能晚地注册并尽快注销。
我在上面的回答中删除了我的评论,即最好在 onresume/onpause 中注册/取消注册。我有一个奇怪的用例,如果我的事件没有到达带注释的订阅者。似乎最好的方法是使用onstart/onstop。这是一个很好的 SO post 解释原因:
@levavare,我认为 register/unregister 的正确时间取决于您的活动以及您打算如何处理这些活动。并且对于同一应用程序中的不同事件可以不同。
例如,我在 Android 应用程序中使用 EventBus,该应用程序通过蓝牙监控实时数据记录设备(在本例中为 Arduino)。我有两种截然不同的事件。
第一个事件由我的蓝牙代码发布,通知我的一个片段已从设备接收到一组新的仪器读数。然后该片段将它们写入数据库 table。重要的是要始终听到事件并采取行动。片段 registers/unregisters 在其 OnCreate/OnDestroy 方法中。我还以更高的优先级订阅了该事件。
另一个事件是当新记录被添加到数据库时由数据库层发布的。我有一系列片段显示不同的读数子集(温度、压力、警报条件)。当其中一个片段被查看时,它应该在新读数进入数据库后立即更新。但是当片段不在视线范围内时,它就没有理由对读数采取行动。我在 OnStart/OnStop 中有那些片段 register/unregister。我打算在 OnResume/OnPause 中完成这项工作,坦率地说,我认为它也适用于我的应用程序。但是@Jordy 的回答和 link 说服我改用 OnStart/OnStop。
Form EventBus Documentation that I found and it's works fine for me:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
And if you need to send the EventBus reference to the child then:
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");
}
}