Help us understand the problem. What is going on with this article?

Otto を使って快適 pub/sub 生活

More than 5 years have passed since last update.

Otto って

色々なライブラリをオープンソースとしてくれている square による event bus 用のライブラリです。

Otto is an event bus designed to decouple different parts of your application while still allowing them to communicate efficiently.

(from 公式)

event bus って

レイヤーの上から下のモジュールを呼ぶ場合は、素直にメソッドをコールすることで実現できます。
ですが、反対向きの場合だとコールバックを用意したりで色々面倒ですよね。
その問題を解決するための仕組みです。

具体的には pub/sub をクラスベースでシンプルに書けるような感じ。

従来の書き方

  • android.graphics.Point を publish したい場合

publish side

void doPublish(Context context, Point point) {
    Intent intent = new Intent(SubscribeFragment. ACTION_POINT_PUBLISH).
        putExtra("x", p.x).
        putExtra("y", p.y);

    context.sendBroadcast(intent);
}

subscribe side

SubscribeFragment.java
static final String ACTION_POINT_PUBLISH = "some.unique.string";

BroadcastReceiver mValueReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Point point = new Point();
        point.x = intent.getIntExtra("x", 0);
        point.y = intent.getIntExtra("y", 0);

        receiveValue(point);
    }
};

void receiveValue(Point point) {
    // do stuff
}

@Override
public void onResume() {
    super.onResume();

    IntentFilter filter = new IntentFilter(ACTION_VALUE_PUBLISH);
    getActivity().registerReceiver(mValueReceiver, filter);
}

@Override
public void onPause() {
    getActivity().unregisterReceiver(mValueReceiver);

    super.onPause();
}

所感

  • わざわざ Intent に入れたり出したりするのとかイケてない
  • めんどい
    • Broadcast したい対象が複数になったりすると、さらにめんどい

Otto を使うと

publish side

void doPublish(Context context, Point point) {
    BusHolder.get().post(point);
}

subscribe side

SubscribeFragment.java
@Subscribe
void receiveValue(Point point) {
    // do stuff
}

@Override
public void onResume() {
    super.onResume();

    BusHolder.get().register(this);
}

@Override
public void onPause() {
    BusHolder.get().unregister(this);

    super.onPause();
}

singleton

BusHolder.java
class BusHolder {
    static Bus mBus = new Bus();

    static Bus get() {
        return mBus;
    }
}

所感

  • アノテーション付けるだけで良いのが素敵
  • 自作クラスだろうとフレームワークのクラスだろうと気にせず post すれば (大体) おっけー
  • 複数クラスを subscribe する場合はメソッドを増やすだけでよい (!!)

and more

  • Otto は guava の EventBus を fork して Android に最適化してある
  • greenDAO などで有名な greenbot さんも独自実装の event bus を 公開 してくれています
funnything
main(c){write(read(0,&c,1)&&main());}
dena_coltd
    Delight and Impact the World
https://dena.com/jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away