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

tumblr

tumblr(タンブラー)は、メディアミックスブログサービス。ブログとミニブログ、そしてソーシャルブックマークを統合したマイクロブログサービスである。アメリカのDavidville.inc(現: Tumblr, Inc.)により2007年3月1日にサービスが開始された。

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なメソッドはサブクラス自体に書かないといけないっぽい。面倒…