ottoのハマリポイント
イベントのsubscribeとpublishはottoを使っている。なんか今のところこれが情報多そうだったから。
が、つかっててハマるポイントもあったので覚書
UIへの変更は出来ない
他の遅延タスク系と同じで、UIへの変更はotto経由だとうまくいかない。なので、looperを噛ませないといけない。 Busインスタンスはシングルトンで他のところからも使い回すような形にすることが多いと思う。で、そのシングルトンでインスタンスを作る時にそのlooperを噛ませたラッパークラスを使う。
public class MainThreadBus extends Bus { private final Handler mHandler = new Handler(Looper.getMainLooper()); @Override public void post(final Object event) { if (Looper.myLooper() == Looper.getMainLooper()) { super.post(event); } else { mHandler.post(new Runnable() { @Override public void run() { MainThreadBus.super.post(event); } }); } } public class BusHolder { private static final Bus sBus = new MainThreadBus(); public static Bus getInstance() { return sBus; } }
これでBusHolder.getInstance().post()とかすればUIにも変更が加えられる。 参考: android - How to send event from Service to Activity with Otto event bus? - Stack Overflow
サブクラスでのsubscribeはできない。
ActivityでonResumeの中あたりでBusHolder.getInstance().register(this)とかして、@Subscribeアノテーションをつけたメソッドを作ってイベント発行しても、なぜかsubscribe側のメソッドが呼ばれない場合がある。なんでだろうと思って色々いじってみたけど、そのactivityが別アクティビティのスーパークラスだったのがいけなかった。インターフェースでもだめらしい。なので、@Subscribeなメソッドはサブクラス自体に書かないといけないっぽい。面倒…