关于android:哪种Activity生命周期方法最适合注册/注销到事件总线?

Which Activity lifecycle methods are best to register/unregister to event bus?

在活动中注册和注销事件总线(如otto,EventBus或tinybus)的最佳位置是什么?为什么?

  • 的onCreate() - 的onDestroy()
  • 在onStart() - 的onStop()
  • 的onResume() - 的onPause()
  • 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");
        }
    }