EventBus学習ノート

4185 ワード

EventBus学習ノート
使用方法
(1)まず、ベースクラスを継承せず、インタフェースを実装する必要もないメッセージクラスを定義する必要がある.例:
public class MessageEvent{
   private String mMsg;
   public MessageEvent (String msg) {
       mMsg = msg;
   }
   public String getMsg(){
       return mMsg;
   }
}

(2)イベントの購読が必要な場所にイベントを登録する.たとえばactivityのoncreateやApplicationのonCreateメソッドなどです.
EventBus.getDefault().register(this);

(3)イベントを生成し,メッセージを送信する.
EventBus.getDefault().post(messageEvent);

(4)メッセージを処理する.
@Subscribe(threadMode = ThreadMode.Main)
public void XXX(MessageEvent messageEvent) {
    ...
}

3.0までは、EventBusは注記方式を使用していませんでした.メッセージ処理の方法は、onEvent、onEventMainThread、onEventBackgroundThread、およびonEventAsyncに限定され、それぞれ4つのスレッドモデルを表す.
onEvent:onEventをサブスクリプション関数として使用すると、イベントがどのスレッドでパブリッシュされたか、onEventはこのスレッドで実行されます.つまり、パブリッシュイベントと受信イベントスレッドは同じスレッドにあります.このメソッドを使用すると、onEventメソッドでは時間のかかる操作を実行できず、時間のかかる操作を実行するとイベント配信が遅延しやすくなります.onEventMainThread:onEventMainThreadをサブスクリプション関数として使用すると、イベントがどのスレッドでパブリッシュされているかにかかわらず、onEventMainThreadはUIスレッドで実行され、受信イベントはUIスレッドで実行されます.これはAndroidで非常に有用です.AndroidではUIスレッドでしか新しいUIが使用できないためです.従ってonEventMainThreadメソッドでは時間のかかる操作は実行できない.onEventBackground:onEventBackgrondをサブスクリプション関数として使用する場合、イベントがUIスレッドでパブリッシュされている場合、onEventBackgroundはサブスレッドで実行され、イベントがサブスレッドでパブリッシュされている場合、onEventBackground関数数はそのサブスレッドで直接実行されます.onEventAsync:この関数をサブスクリプション関数として使用すると、イベントがどのスレッドでパブリッシュされても、onEventAsyncを実行する新しいサブスレッドが作成されます.
3.0以降、メッセージ処理の方法は任意に名前を付けることができますが、注記@Subscribeを追加し、スレッドモデル(デフォルトはPostThread)、4つのスレッドモデルを指定する必要があります.以下で説明します.
(5)メッセージ購読をキャンセルする.
EventBus.getDefault().unregister(this);

スレッドモード
public enum ThreadMode {
    POSTING,///                  (           ,            )
    MAIN,///       UI     
    BACKGROUND,///                ,           ,          。
              ,          ,             ,            ,              。
               ,         。
    ASYNC ///              ,                ,           (    ),          。
}

ねんせい事象
broadcastのSticky Broadcastのように、登録後に購読メッセージを受信するまでメッセージを送信します.最新のメッセージは1回しか受信できません.
public class StickyEventBusActivity extends AppCompatActivity {

  private int index = 0;
  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.sticky_eventbus);
      findViewById(R.id.post).setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              EventBus.getDefault().postSticky(new MessageEvent("test :: " + index++));
          }
      });
      findViewById(R.id.regist).setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              EventBus.getDefault().register(StickyEventBusActivity.this);
          }
      });

      findViewById(R.id.unregist).setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              EventBus.getDefault().unregister(StickyEventBusActivity.this);
          }
      });
  }

  @Subscribe(threadMode = ThreadMode.POSTING, sticky = true)
  public void onMessageEventPostThread(MessageEvent messageEvent) {
      Log.e(EventBusActivity1.TAG, "onMessageEventPostThread POSTING : "+messageEvent.getMsg());
  }

  @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
  public void onMessageEventMainThread(MessageEvent messageEvent) {
      Log.e(EventBusActivity1.TAG, "onMessageEventMainThread :  "+messageEvent.getMsg());
  }

  @Subscribe(threadMode = ThreadMode.BACKGROUND, sticky = true)
  public void onMessageEventBackgroundThread(MessageEvent messageEvent) {
      Log.e(EventBusActivity1.TAG, "onMessageEventBackgroundThread : "+messageEvent.getMsg());
  }

  @Subscribe(threadMode = ThreadMode.ASYNC, sticky = true)
  public void onMessageEventAsync(MessageEvent messageEvent) {
      Log.e(EventBusActivity1.TAG, "onMessageEventAsync : "+ messageEvent.getMsg());
  }


}

に感謝
eventbusに関する多くの紹介記事の著者たち.