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