web-dev-qa-db-ja.com

イベントベースの機能とサービスからアクティビティへのデータ転送をトリガーするために、ブロードキャストレシーバーをGreenrobot Eventbusに置き換えるのは良いことですか?

状態の変更(接続、切断、onServiceDiscoverd、onCharacteristicChangeなど)を処理し、gattサーバーを介して別のデバイスからデータを受信するサービスを実装しました。

私の質問は、Greenrobot Eventbusブロードキャストレシーバーの交換サービスとアクティビティの間を使用してイベントを効率的に処理できるかどうかです。

19
Dinesh Ravi

LocalBroadcastManagerとは異なり、EventBusはより簡単に使用できます。あなたは3つのステップを経るだけです:

1-イベントクラスを作成します。アクションが発生したときの応答を表す単純なJavaクラス。

2-イベントバスをActivityonCreateメソッドのサブスクライバーとして登録します

  EventBus.getDefault().register(this);

そしてもちろん、ActivityonDestroyメソッドで登録を解除します

 EventBus.getDefault().unregister(this);

3-サブスクライブメソッドは、EventBusに登録したのと同じアクティビティで作成されます。 WorkOrderActivityの例

   @Subscribe
    public void onEvent(EventClass event)

イベントが発生したら、postメソッドを呼び出して、前に作成したイベントオブジェクトを渡す必要があります。

  EventBus.getDefault().post(new EventClass (Data));

Kmainiが述べたように、LocalBroadcastManagerに置き換えることができますが、インテントからのデータを自分でマッピングする必要があります。オブジェクトを渡すことができるEventBusとは異なります。

また、EventBus Libraryの作成者であるgreenrobotがこの質問に答えました ここ

Q:EventBusはAndroidのBroadcastReceiver/Intentシステムとどのように異なりますか?

A:AndroidのBroadcastReceiver/Intentシステムとは異なり、EventBusは標準のJavaクラスをイベントとして使用し、より便利なAPIを提供します。EventBusは、通過したくない多くのユースケースを対象としています。インテントの設定、インテントエクストラの準備、ブロードキャストレシーバーの実装、インテントエクストラの再抽出の手間。また、EventBusのオーバーヘッドははるかに低くなります。

13
Abdelrahman Aly

LocalBroadcastを実装するために私がたどったリンクは次のとおりです。

https://stackoverflow.com/a/8875292/440674

これが私の実装の要約です:

受信アクティビティまたはサービスの場合:

1)ローカルbraodcastに登録します(通常はonCreateで):

LocalBroadcastManager.getInstance(this).registerReceiver(
       mMessageReceiver, new IntentFilter("broacast_name"));

2)ローカルブロードアスト(通常はonDestroy)の登録を解除します。

LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);

3)ブロードキャストレシーバーを定義します。

 private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
           @Override
           public void onReceive(Context context, Intent intent) {
                      //Handle local broadcast
           }
};

送信アクティビティまたはサービスの場合:

Intent it = new Intent("broacast_name");
it.putExtra("data", "value");
LocalBroadcastManager.getInstance(context).sendBroadcast(it);
1
kmaini

別の見方をすれば、Androidのブロードキャストマネージャーはメインスレッドハンドラーのメッセージキューを使用してイベントを処理すると思います。したがって、別のスレッドを自由に使用できる場合(UIイベント/ジョブがない場合)/tasks)を適切なキュー(別のHandlerThreadを使用するなど)で使用すると、UIイベントを妨害したり、UI作業と混同したりすることなく、そのスレッドの特定のキューを使用してジョブを処理できます。スレッドの優先度の値で遊ぶこともできます。仕事のバランスをとる。

さて、GreenRobotが数行のコードですべての機能を提供している場合、パフォーマンスの向上を確認するために間違いなく試してみます。

1
stdout

EventBusを使用すると、任意のJavaオブジェクトをイベントに渡すことができるため、作業がはるかに簡単になります。オブジェクトはIntentsと「面倒な」パーセル化可能な実装を実装する必要があるため、Parcelableでも同じことは行いません。既存のコードベースで何をすべきかわからないかもしれません。

0
peterchaula