読者です 読者をやめる 読者になる 読者になる

ワシはワシが育てる

週刊少年ジャンプと任天堂のゲームが三度のメシより好きです。

EventBusを使ってAndroidでNSNotification的なものを実装する

iOS開発を2ヶ月ほど行った後、再びAndroidに戻ったのですが、NSNotification(クラスをまたいだ通知)をAndroidで実装するのがデフォルトのままだと面倒だなーと感じていました。
そこでライブラリを探したところ、EventBusが非常に便利だったので紹介します。

Githubページにあるように、行うことは以下の3つだけです。

  • イベントを媒介するクラスを作成する(継承は必要ではなく単なるJavaのクラス)
  • イベントを受信するクラスでEventBusのインスタンスを登録する
  • イベントを送信するクラスでEventBusのインスタンスを通じて送信する

イベントを媒介するクラス

これは通常のJavaのクラスで何も継承する必要はありません。 イベントを受信する際、引数でこのクラスのインスタンスを取り出すことになります。

単なるクラスである以上、実装方法は種々あると思いますが、一例として送信したいデータをそのままクラス変数に格納してしまうこともできます。

class EventClass {
    private EventClass mEventClass;

    // 例えばフォロー数の変更を検知する
    public int followCount;
    public boolean followChanged;

    public static EventClass getInstance() {
        if (mEventClass == null) {
            mEvnetClass = new EventClass();
        }

        return mEventClass;
    }
}

イベントを受信するクラス

イベントを受信するクラスでは、EventBusインスタンスの登録と、受信した際に呼ばれるメソッドを定義します。

// 登録
EventBus.getDefault().register(this); 

// イベント受信時に呼ばれる
// IDEでは未使用とみなされますが気にしないでください
public void onEvent(EventClass eventClass) {
    if (eventClass.followChanged) {
        /* do something */
    }
};

イベントを送信するクラス

イベントを送信するクラスでは、任意のタイミングでEventBusインスタンスのpostメソッドを呼び出します。その際、引数として対象のイベントクラスのインスタンスをセットします。

EventClass eventClass = EventClass.getInstance();
eventClass.followCount = 50;
eventClass.followChanged = true;
EventBus.getDefault().post(eventClass);

例に書いたとおりに実装すると、EventClassのクラス変数を通じてフォロー数の変更を通知することが出来ます。