注册和取消注册到活动中的事件总线(如otto,EventBus或tinybus)的最佳位置是什么?为什么?
Otto的示例使用onResume() - onPause(),EventBus提到onStart() - onStop(),我们需要在我们的应用程序中使用onCreate() - onDestroy()来更新活动的UI,即使它在背景。 所以我想它可以是三个中的任何一个,取决于事件的性质和它们的处理,但我想知道是否还有更多应该考虑的内容。
答案 0 :(得分:13)
首先,它不是一个客观的问题,而是一个主观的问题,并会根据论点得出很多论据。
根据我的经验, 我们在其中一个项目中使用了Otto。我们跟着onResume() - onPause(),这对我们非常好。这也是有道理的,因为我们应该尽可能晚地注册。使用事件总线时尽快取消注册。
答案 1 :(得分:8)
@levavare,我认为注册/取消注册的正确时间取决于您的活动以及您打算如何处理它们。并且对于同一应用程序中的不同事件可以有所不同。
例如,我在Android应用程序中使用EventBus,该应用程序通过蓝牙监视实时数据记录设备(在本例中为Arduino)。我有两种截然不同的事件。
我的蓝牙代码发布了第一个事件,通知我的一个片段已从设备收到一组新的仪器读数。然后该片段将它们写入数据库表。重要的是始终能听到并采取行动。该片段在其OnCreate / OnDestroy方法中注册/取消注册。我还以高优先级订阅了该事件。
当新记录添加到数据库时,数据库层将发布另一个事件。我有一系列碎片显示读数的不同子集(温度,压力,报警条件)。当正在查看其中一个片段时,一旦新读数在数据库中,它就应该更新。但是当片段不在视线范围内时,没有理由让它在阅读中起作用。我在OnStart / OnStop中注册/取消注册这些片段。我打算在OnResume / OnPause上做这项工作,坦率地说,我认为它对我的应用程序也有效。但@Jordy的答案和链接让我确信要使用OnStart / OnStop。
答案 2 :(得分:3)
我在上面的回答中删除了我的评论,最好在onresume / onpause中注册/取消注册。我有一个奇怪的用法,如果我的事件没有到达带注释的订阅者。似乎最好的方法是使用onstart / onstop。这是一篇很好的SO帖子,解释了原因:
答案 3 :(得分:0)
我找到的表格EventBus Documentation,它对我来说很好用:
@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");
}
}