web-dev-qa-db-ja.com

イベントバスへの登録/登録解除に最適なアクティビティライフサイクルメソッドはどれですか?

registerおよびnregisterをアクティビティのイベントバス(オットー、EventBus、またはtinybusなど)に最適な場所とその理由は何ですか?

  1. onCreate()-onDestroy()
  2. onStart()-onStop()
  3. onResume()-onPause()

Ottoの例では、onResume()-onPause()、EventBusの言及onStart()-onStop()を使用しており、バックグラウンドにあるときでも、アクティビティのUIを更新するためにアプリでonCreate()-onDestroy()を使用する必要がありました。そのため、イベントの性質とその処理に応じて、3つのうちのいずれかになると思いますが、それ以外に考慮すべきことがあるかどうか疑問に思っていました。

23
levavare

@levavare、私は、登録/登録解除の正しい時間はあなたのイベントとあなたがそれらをどうするつもりかによって決まると思うまた、同じアプリケーション内のイベントごとに異なる場合があります。

たとえば、AndroidアプリでBluetoothを介してリアルタイムデータログデバイス(この場合はArduino)を監視する)でEventBusを使用しています。2つのまったく異なるタイプのイベントがあります。

最初のイベントは私のBluetoothコードによって投稿され、新しいフラグメントの計測値がデバイスから受信されたことをフラグメントの1つに通知します。次に、そのフラグメントはそれらをデータベーステーブルに書き込みます。イベントを常に聞いて行動することが重要です。フラグメントは、OnCreate/OnDestroyメソッドで登録/登録解除します。また、優先度を上げてそのイベントに登録します。

もう1つのイベントは、新しいレコードがデータベースに追加されたときにデータベースレイヤーによってポストされます。読み取り値のさまざまなサブセット(温度、圧力、アラーム状態)を示す一連のフラグメントがあります。これらのフラグメントの1つが表示されている場合、新しい読み取り値がデータベースにあるとすぐに更新されます。しかし、フラグメントが見えない場合、それがリーディングに作用する理由はありません。 OnStart/OnStopでこれらのフラグメントを登録/登録解除します。私はOnResume/OnPauseでその作業を行うつもりでしたが、率直に言って、私のアプリでも同様に機能すると思います。しかし、@ Jordyの回答とリンクにより、代わりにOnStart/OnStopを使用するようになりました。

8
Anne Gunn

まず第一に、それは客観的な質問ではなく、主観的な質問であり、議論に基づいて多くの議論を引き寄せます。

私の経験から、私たちはプロジェクトの1つで Otto を使用しました。私たちはonResume()-onPause()に従いました。また、イベントバスを使用している間はできるだけ遅く登録し、できるだけ早く登録解除する必要があるのも当然です。

13
Amit K. Saha

上記の回答で私のコメントを削除しました。onresume/ onpauseで登録/登録解除するのが最善の方法です。私は奇妙なユースケースを取得しましたが、私のイベントが注釈付きサブスクライバーに到達しなかった場合、最良の方法は、onstart/onstopを使用することです。ここに良いSO理由を説明する投稿があります:

https://stackoverflow.com/a/19737191/2361947

3
Jordy

フォーム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");
    }
}
0