EventBus3.0の紹介と正しい使用法
定期的なイベント配信
- 意図、ジャンプ+転送パラメータ(非常に制限されています)
- ハンドラー。通常、メインスレッドのUIを更新するために使用されます。不適切なSihongは、メモリリークが発生しやすいです。
- 同じスレッド内のデータ相互作用に限定されたインターフェースインターフェース
- BroadCastReceiver、注文放送+無秩序放送
- AIDLのクロスプロセス通信、コードの読み取りはフレンドリーではなく、メンテナンスコストは高い
- ローカルストレージなどの他の方法。。。
EventBusとは何ですか?
EventBusは、Androidに最適化された発行/サブスクライブメッセージイベントバスであり、アプリケーション内のさまざまなコンポーネント間、コンポーネントとバックグラウンドスレッド(
アクティビティ、フラグメント、スレッド、サービスなど)間の通信を簡素化します。
使用するシーン
例:
- ネットワークリクエストなど、戻るときに、HandlerまたはBroadCastBeceiver通知を介してメインスレッドUIを更新します
- Nフラグメントは、リスナー(モニター)を介して通信する必要があり
ます。これらの要件は、EventBusを介して完了および実装できます。
公式アーキテクチャ図
GitHubアドレス:
https://github.com/greenrobot/EventBus
EventBusライブラリをインポートする
ビルド、gradle
implementation 'org.greenrobot:eventbus:3.2.0'
EventBusの使用
EventBusは3つのステップを使用します
正式な登録/登録解除によって提供される方法が反映されます
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
実際、実際の開発では、EvenBusメソッドを正しく使用しています。appbuild、gradle
の依存関係モジュールに注釈依存関係ライブラリを追加します。
annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.1.1'
アプリビルド、gradleのdefaultConfigモジュールを追加します
// 给注解处理器传参
javaCompileOptions {
annotationProcessorOptions {
arguments = [ eventBusIndex : 'com.netease.eventbus.demo.MyEventBusIndex' ]
}
}
使用するカスタムアプリケーションのonCreateメソッドに次のコードを追加します。
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
- イベントを定義する
public static class MessageEvent { /* Additional fields if needed */ }
- イベントをサブスクライブします(注釈+メソッド指定のパラメーター)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
スティッキーイベント
sticky = true @Subscribeアノテーションを追加:sticky = true
機能:消費の遅延または初期化されていない
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onMessageEvent(UserInfo user) {/* Do something */};
- イベントの送信(メッセージの送信)
EventBus.getDefault().post(new MessageEvent());
EventBusサブスクリプションメソッドの実行優先度
@Subscribe(threadMode = ThreadMode.MAIN, priority = 1)
public void onMessageEvent(UserInfo user) {
//消费消息/事件
tv.setText(User.toString)
Log.e("mile","onMessageEvent");
};
// priority优先级越高,数值越大。默认都为0
@Subscribe(threadMode = ThreadMode.MAIN, priority = 10)
public void onMessageEvent(UserInfo user) {
//消费消息/事件
tv.setText(User.toString)
Log.e("mile","onMessageEvent");
};
2つのサブスクリプション方式が同時に受信できる場合、優先度の値が高いほど、優先度が高くなります。デフォルトは0です