Android EventBus知っておくべきことはすべてここにある

16751 ワード

Android EventBus知っておくべきことはすべてここにある
EventBusとは
EventBusはAndroidイベントのリリース/購読の軽量レベルのフレームワークであり、オブザーバーモードに基づいてイベントの受信者と送信者を分離し、主にintent、Handler、BroadCastの代わりにFragment、activity、serviceスレッドの間でメッセージを伝達する.GitHubの人気オープンソースプロジェクトとしては、現在(2020-04-26)までに22.4 kのスターがいる.
EventBus-GitHub
統合
    implementation 'org.greenrobot:eventbus:3.1.1'

Eventの基本的な使い方
Eventの使い方は非常に簡単で、一般的には5つのステップに分けられています.
  • イベントクラス
  • を定義する
    public class MessageEvent{
        ···
    }
  • 購読イベント
  • EventBus.getDefault().register(this);
  • 送信イベント
  • EventBus.getDefault().post(new MessageEvent())
  • 処理イベント
  •     @Subscribe(threadMode = ThreadMode.MAIN)
        fun XXX(MessageEvent messageEvent){
            ···
        }

    メソッド名は任意に取ることができますが、@Subscribe注釈を追加する必要があります.注釈にはThreadModeがあります.MAINは、メインスレッドで実行されるスレッドモデルを指定します.これは後述します.
  • 登録解除イベント
  • EventBus.getDefault().unregister(this);

    EventBusの適用例
    public class MainActivity extends AppCompatActivity {
    //     
    
        private TextView tv_message;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            EventBus.getDefault().register(this);//  
            tv_message = findViewById(R.id.tv_message);
            findViewById(R.id.bn_main).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    startActivity(new Intent(MainActivity.this,SecondActivity.class));
                }
            });
        }
        @Subscribe(threadMode = ThreadMode.MAIN)//      
        public void  onEventMainThred(MyEvent event){
           tv_message.setText(event.getEvent())
       }
        @Override
        protected void onDestroy() {
            super.onDestroy();
            EventBus.getDefault().unregister(this);//  
        }
    }
    //     
    public class SecondActivity extends Activity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            findViewById(R.id.bn_main).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    MyEvent myEvent = new MyEvent();
                    myEvent.setEvent("hello");
                    EventBus.getDefault().post(myEvent);
                    finish();
                }
            });
        }
    }
    //   
    public class MyEvent {
        private String event;
    
        public String getEvent() {
            return event;
        }
    
        public void setEvent(String event) {
            this.event = event;
        }
    }

    SecondActivityのボタンクリックイベントでは、クリックしてMainActivityに戻り、MainActivityのTextViewの内容もhelloになります.
    この例から,EventBusの機能はオブザーバーモードとブロードキャストに類似しているが,EventBusはヘビー級のブロードキャストよりも複雑な呼び出しとオブジェクトシーケンス化のオーバーヘッドを低減し,パブリッシャーとサブスクライバの関係をデカップリングし,コード構造上もより明確で簡単であることがわかる.
    EventBusの3要素
  • Event:イベントは任意のタイプであり、EventBusはイベントのタイプに応じてグローバルな通知を行います.
  • Subscriber:イベント購読者、EventBus 3.0の前にonEventで始まるいくつかの方法を定義する必要があります.それぞれonEvent、onEventMainThread、onEventBackgroundThread、onEventAsyncですが、3.0以降のイベント処理の方法名は自由に取ることができますが、注釈@subscribeを付け、スレッドモデルを指定する必要があります.デフォルトはPOSTINGです.
  • Publisher:イベントのパブリッシャは、任意のスレッドでイベントをパブリッシングできます.一般的にEventBusを使用する.getDefault()はEventBusオブジェクトを取得し、post(Object)メソッドを呼び出すことができます.

  • EventBusの4種類のスレッドモデル
    EventBusのスレッドモデルは、イベント購読時にSubscriber注釈で設定した変数です.
  • POSTING:デフォルトでは、イベント処理関数のスレッドとイベントをパブリッシュするスレッドが同じスレッドにあることを示します.
  • MAIN:イベント処理関数を表すスレッドはメインスレッド(UI)スレッドにありますので、ここでは時間のかかる操作はできません.
  • BACKGROUND:イベント処理関数を表すスレッドがバックグラウンドスレッドにあるため、UI操作ができない.イベントをパブリッシュするスレッドがプライマリ・スレッド(UIスレッド)である場合、イベント処理関数はバックグラウンド・スレッドを開き、イベントをパブリッシュするスレッドがバックグラウンド・スレッドである場合、イベント処理関数はそのスレッドを使用します.
  • ASYNC:イベントが発行されたスレッドがどれであるかにかかわらず、イベント処理関数は常に新しいサブスレッドで実行され、UI操作もできないことを示します.

  • EventBusの粘性イベント
    EventBusは、通常のイベントを送信するだけでなく、スティッキー・イベントの送信もサポートします.つまり、イベントを送信してからイベントを購読しても、スティッキー・ブロードキャストと同様に、次のようなイベントを受信できます.
    1.サブスクライバ処理粘性イベント
        @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
        fun XXX(MessageEvent messageEvent){
            ···
        }

    2.スティッキーイベントの送信
    EventBus.getDefault().postSticky(new MessageEvent())

    コードは、このような処理を経て、イベントを先に送信し、イベントEventBus.getDefault().register(this);を購読する際に、イベント処理を行うことができる.
    EventBusの優先順位
    Subscribe注記には合計3つのパラメータがあり、ここでは以下の3番目のパラメータ、すなわちpriorityを使用します.サブスクリプションメソッドの優先度を指定するために使用されます.整数タイプの値で、デフォルトは0です.値が大きいほど優先度が大きくなります.あるイベントがパブリッシュされると、優先度の高いサブスクリプションメソッドが最初にイベントを受け入れます.
    優先度をテストするには、上記のコードをいくつか変更する必要があります.ここでは、イベントの配布をキャンセルすべきかどうかを判断するために、ブールタイプの変数を使用します.優先度の高いメソッドでは、trueなしでイベントの継続的な配布を停止すると、優先度の高いサブスクリプションメソッドがイベントを取得できないため、優先度の高いサブスクリプションメソッドが最初にイベントを取得したことを証明するブール値によって判断します.