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 を 公開 してくれています