RxGroups

RxJava Observable を簡単にグループ化して、Android アクティビティライフサイクルと関連付ける
696
作者Felipe Lima

RxGroups を使用すると、RxJava Observable をグループ化して、Android ライフサイクルと関連付けることができます。これは Retrofit と併用するときに特に役立ちます。

簡単なシナリオでは、元のリクエストがキャンセルされ、新しいリクエストが発行されるのを放置すればよいでしょう。しかし、より複雑な状況では、これにより問題が発生するのは明らかです。

ユーザーが支払いを送信している場合を考えてみましょう。画面を回転させたり、アクティビティを終了して後から戻ったりしても、同じ処理中のリクエストまたは完了したリクエストに再接続できるようにしたいはずです。

RxGroups は、onResume() の前に、または onPause() の後に、Activity または Fragment にイベントが配信されるのを自動的に防止します。配信が行われる場合、それらはメモリ内に自動的にキャッシュされ、ユーザーが画面に戻ると配信されます。ユーザーが戻らない場合、メモリは onDestroy() の後に自動的に再利用されます。

使用方法

  1. GroupLifecycleManager フィールドを ActivityFragmentDialog などに追加し、(例:onPauseonResumeonDestroy など)に応じたライフサイクルメソッドを呼び出します。
  2. @AutoResubscribeResubscriptionObserver に注釈を付け、resubscriptionTag() メソッドを使用して、RxGroups に、ObserverObservable に自動的に再接続する場合に使用するタグを伝えます。
  3. `Observable` を購読する前に、`observableGroup.transform()` で構成して、その Observable のタグを定義します。

public class MyActivity extends Activity {
  private static final String OBSERVABLE_TAG = "arbitrary_tag";
  private TextView output;
  private FloatingActionButton button;
  private GroupLifecycleManager groupLifecycleManager;
  private ObservableGroup observableGroup;
  private Observable<Long> observable = Observable.interval(1, 1, TimeUnit.SECONDS);

  // The Observer field must be public, otherwise RxGroups can't access it
  @AutoResubscribe public final ResubscriptionObserver<Long> observer = new ResubscriptionObserver<Long>() {
    @Override public void onCompleted() {
      Log.d(TAG, "onCompleted()");
    }

    @Override public void onError(Throwable e) {
      Log.e(TAG, "onError()", e);
    }

    @Override public void onNext(Long l) {
      output.setText(output.getText() + " " + l);
    }

    @Override public Object resubscriptionTag() {
      return OBSERVABLE_TAG;
    }
  };

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    output = (TextView) findViewById(R.id.txt_output);
    button = (FloatingActionButton) findViewById(R.id.fab);
    SampleApplication application = (SampleApplication) getApplication();
    ObservableManager manager = application.observableManager();
    groupLifecycleManager = GroupLifecycleManager.onCreate(manager, savedInstanceState, this);
    observableGroup = groupLifecycleManager.group();

    button.setOnClickListener(v -> observable
        .compose(observableGroup.<Long>transform(OBSERVABLE_TAG))
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(observer));
  }

  @Override protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    groupLifecycleManager.onSaveInstanceState(outState);
  }

  @Override protected void onResume() {
    super.onResume();
    groupLifecycleManager.onResume();
  }

  @Override protected void onPause() {
    super.onPause();
    groupLifecycleManager.onPause();
  }

  @Override protected void onDestroy() {
    super.onDestroy();
    groupLifecycleManager.onDestroy(this);
  }
}

オプション@AutoResubscribeResubscriptionObserver を使用したくない場合は、単に resubscriptionTag() という名前の public メソッドがある通常の Observer 匿名クラスを使用します。例:

@AutoResubscribe public final Observer<Long> observer = new Observer<Long>() {
    @Override public void onCompleted() {
    }

    @Override public void onError(Throwable e) {
    }

    @Override public void onNext(Long l) {
    }

    public Object resubscriptionTag() {
      return Arrays.asList("tag1", "tag2", "tag3");
    }
  };

メソッドが存在しないか、public ではない場合、RxGroups は RuntimeException をスローし、通知します。配列や List を含む、任意の Object タグを Observer に使用できます。その場合、Observer はコレクション内のすべてのタグと関連付けられ、同じ Observer を複数の Observables で共有できます。

Gradle でダウンロード

compile 'com.airbnb:rxgroups-android:0.3.5'

詳細については サンプルアプリ を参照し、完全な例を確認してください。

開発バージョンのスナップショットは Sonatype のsnapshots リポジトリ で利用できます。