我想在用户点击按钮时调用请求。但是当第一次请求没有响应时,用户想要更改参数并使用相同的URL调用新请求。
问题 如何取消第一个请求并使用相同的URL调用新请求。
ServiceFactory
.createService()
.getSomething(page)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DefaultObserver<SomthingResponse>() {
@Override
public void onNext(@NonNull SomthingResponse response) {
showSomthing()
hideProgressDialog();
}
@Override
public void onError(@NonNull Throwable e) {
hideProgressDialog();
showErrorMessage(e.getMessage());
}
@Override
public void onComplete() {
}
});
当用户点击按钮用户将页面参数发送到查询字符串但此请求尚未完成。用户将更改为页面参数并发送新请求。我想取消第一个请求。
三江源
答案 0 :(得分:5)
问题的回答是switchMap()
运营商:
public static class User {} // Dummy server response
public Observable<Object> getButtonClicks() {
return RxView.clicks(findViewById(R.id.button)); // (1)
}
public Single<User> getUserFromApi() {
return Single.just(new User()) // (2)
.delay(5, TimeUnit.SECONDS);
}
public void fun() {
getButtonClicks()
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(Schedulers.io())
.switchMap(__ -> getUserFromApi().toObservable()) // (3)
.observeOn(AndroidSchedulers.mainThread()) // (4)
.subscribeWith(new DisposableObserver<User>() {
@Override public void onNext(@NonNull User user) {
Log.d("fun", "onNext");
}
@Override public void onError(@NonNull Throwable e) {
Log.d("fun", "onError");
}
@Override public void onComplete() {
Log.d("fun", "onComplete");
}
});
}
这里会发生什么:
Object
。MainThread
。答案 1 :(得分:1)
您可以使用主题和去抖动
http://reactivex.io/documentation/operators/debounce.html
您可以查看此示例,它解决了类似的问题。当用户输入查询时,仅当用户停止编辑1秒时才启动请求,这样才会显示上一个请求的结果:
requestsAPI.queryMovies(query, pagesLoaded)
.observeOn(schedulerMain)
.debounce(1000, TimeUnit.MILLISECONDS)
.subscribe(new Subscriber<List<MovieQuery>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<MovieQuery> movieQueries) {
onMoviesLoaded(filterMoviesFromSearchResults(movieQueries));
}
});