RxGroups を使用すると、RxJava Observable
をグループ化して、Android ライフサイクルと関連付けることができます。これは Retrofit と併用するときに特に役立ちます。
簡単なシナリオでは、元のリクエストがキャンセルされ、新しいリクエストが発行されるのを放置すればよいでしょう。しかし、より複雑な状況では、これにより問題が発生するのは明らかです。
ユーザーが支払いを送信している場合を考えてみましょう。画面を回転させたり、アクティビティを終了して後から戻ったりしても、同じ処理中のリクエストまたは完了したリクエストに再接続できるようにしたいはずです。
RxGroups は、onResume()
の前に、または onPause()
の後に、Activity
または Fragment
にイベントが配信されるのを自動的に防止します。配信が行われる場合、それらはメモリ内に自動的にキャッシュされ、ユーザーが画面に戻ると配信されます。ユーザーが戻らない場合、メモリは onDestroy()
の後に自動的に再利用されます。
GroupLifecycleManager
フィールドを Activity
、Fragment
、Dialog
などに追加し、(例:onPause
、onResume
、onDestroy
など)に応じたライフサイクルメソッドを呼び出します。@AutoResubscribe
で ResubscriptionObserver
に注釈を付け、resubscriptionTag()
メソッドを使用して、RxGroups に、Observer
を Observable
に自動的に再接続する場合に使用するタグを伝えます。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);
}
}
オプション:@AutoResubscribe
と ResubscriptionObserver
を使用したくない場合は、単に 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
で共有できます。
compile 'com.airbnb:rxgroups-android:0.3.5'
詳細については サンプルアプリ を参照し、完全な例を確認してください。
開発バージョンのスナップショットは Sonatype のsnapshots
リポジトリ で利用できます。