我开始在我现有的应用程序中使用 RxAndroid。我从一个非常简单的 Activity 开始,我有一个搜索字段,并在文本更改时使用 Retrofit 联系 API。我还想取消当前未完成的请求(如果有的话),然后再开始新的请求。这是我目前所拥有的:
private Subscription currentRequestSubscription = null;
// Create stream of filtered queries
Observable<String> queryObservable = RxTextView.textChanges(searchView)
.startWith("")
.debounce(DELAY_BEFORE_REQUEST, TimeUnit.MILLISECONDS)
.map(new Func1<CharSequence, String>() {
@Override
public String call(CharSequence charSequence) {
return charSequence.toString();
}
})
// Make search request and update UI
queryObservable.observeOn(Schedulers.io())
.subscribe(new Action1<String>() {
@Override
public void call(String query) {
if (currentRequestSubscription != null) {
currentRequestSubscription.unsubscribe();
}
currentRequestSubscription = createAPIRequestObservable(query)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(... update UI with results ...);
}
});
我觉得存储订阅并不真正符合响应式编程。我怎样才能以更标准的方式做到这一点?
最佳答案
在这种情况下不需要每次都创建一个新的订阅,switchMap
可以在有新的 observable 时负责取消对旧的 observable 的订阅。像这样:
currentRequestSubscription = RxTextView.textChanges(searchView)
.observeOn(Schedulers.io())
.startWith("")
.debounce(DELAY_BEFORE_REQUEST, TimeUnit.MILLISECONDS)
.map(CharSequence::toString)
.switchMap(text -> createAPIRequestObservable(text).subscribeOn(Schedulers.io()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(/*... update UI with results ...*/);
也不错example .
关于android - 改进 RxJava 中的请求取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33961585/