我经常使用它将一些 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 完成的网络请求),然后观察它们。
请注意,可观察到的 inflatMap
可以发出单个值,这是在 sample 中完成的。
通过这种方式,我以声明方式定义了 UI 和后台进程之间的交互。我用 处理错误,doOnError
然后用它onErrorResumeNext(Observable.<Integer>empty())
来防止 observable 以onError
. 因为我使用flatMap
,所以我的 observable 没有完成(而 innerflatMap
是)并且正在等待下一次点击事件。
您可以在我的文章中找到完整的代码示例。