ottoの@Produceに関して

2014-02-03T00:00:00+00:00 Android Java

Androidのイベントバスなライブラリとしてottoが有名ですが、これの@Produceアノテーションの動作が微妙だったので検証してみた所だと

  • Bus.registerされたら@Produceが付いてるアノテーションなメソッドが作用する
  • @Produceがついてるメソッドから返されるオブジェクトに対してBus.postされる (というのが理由なので@Produceがついてるメソッドはvoidにするとエラーになる)
  • Bus.postされたオブジェクトが@Subscribeによってキャッチ可能 (今回は特記すべき事ではない)

っていう事で要は「registerされた時に着火するイベント」的な感じなのかと

package sample.test;

import com.squareup.otto.Bus;
import com.squareup.otto.Produce;
import com.squareup.otto.Subscribe;
import com.squareup.otto.ThreadEnforcer;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {

    private static final String TAG = MainActivity.class.getName();
    private final Bus bus = new Bus();

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        Log.v(TAG, "onCreate");
        bus.register(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.v(TAG, "onPause");

        bus.unregister(this);
    }

    // voidは作用できない
    @Produce
    public SampleEvent produce() {
        Log.v(TAG, "produce");
        return new SampleEvent();
    }

    @Subscribe
    public void onSampleEvent(SampleEvent event) {
        Log.v(TAG, "onSampleEvent");
    }

    private class SampleEvent {
    }
}

単純に上記な場合だと

  • MainActivity#onCreate (Androidのライフサイクル)
  • MainActivity#produce
  • MainActivity#onSampleEvent
  • MainActivity#onPause

本来、Bus.postしない限りは@Subscribeがついてるメソッドにはイベント着火されない。だけれども初期状態を示すようなオブジェクトをイベントに着火させておく必要がある場合などにおいては@Produceを使う事でregisterされた際にイベント着火させる事が可能

但し、@Produceはどっかで@Subscribeしてないと着火しない模様。おそらくは@Produceで返すオブジェクトの型と@Subscribeの引数で着火されるオブジェクト型が一致するのが発見出来なければ着火しないって事じゃないかと。ざっくりのソース読んだので非常に微妙だけれども

んまぁソース読んで検証してみた方が良いかと

Twitter Bootstrap+sidr.jsによるスライドコンテンツ領域に関して RefreshActionItem