UI イベントの一部を監視可能なバックグラウンド タスクに変換するためによく使用します。
ViewObservable.clicks(calculateBtn)
.flatMap(new Func1<OnClickEvent, Observable<Integer>>() {
@Override
public Observable<Integer> call(OnClickEvent onClickEvent) {
return observeBackgroundOperation()
.observeOn(AndroidSchedulers.mainThread())//interaction with UI must be performed on main thread
.doOnError(new Action1<Throwable>() {//handle error before it will be suppressed
@Override
public void call(Throwable throwable) {
progress.setVisibility(View.GONE);
calculateBtn.setEnabled(true);
Toast.makeText(IOCombineSampleActivity.this, R.string.mix_error_message, Toast.LENGTH_SHORT).show();
}
})
.onErrorResumeNext(Observable.<Integer>empty());//prevent observable from breaking
}
})
.subscribe(new Action1<Integer>() {...});
observable を使用してバックグラウンド操作を定義するのは簡単なので、flatMap
ボタン クリック イベントを「バックグラウンド イベントで行われる何か」(たとえば、Retrofit で終了するネットワーク リクエスト) に変換してから観察していました。
flatMap
オブザーバブルは単一の値を発行できることに注意してください。これはサンプルで行われます。
このようにして、UI とバックグラウンド プロセス間の相互作用を宣言的に定義しました。でエラーを処理しdoOnError
、それを使用onErrorResumeNext(Observable.<Integer>empty())
してオブザーバブルが で終了するのを防ぎますonError
。私は を使用しているためflatMap
、オブザーバブルは完了せず (内部flatMap
は完了していません)、次のクリック イベントを待機しています。
私の記事で見つけることができるコードの完全なサンプル。