当我请求相同的url时,如何在retrofix2.0(rxandroid)中取消请求

Wut*_*ada 0 android rx-java rx-android retrofit2 rx-java2

我想在用户点击按钮时调用请求.但是当第一次请求没有响应时,用户想要更改参数并使用相同的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() {

                }
            });
Run Code Online (Sandbox Code Playgroud)

当用户点击按钮时,用户会将页面参数发送到查询字符串,但此请求尚未完成.用户将更改为页面参数并发送新请求.我想取消第一个请求.

谢谢

sky*_*all 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");
                }
            });
}
Run Code Online (Sandbox Code Playgroud)

这里发生了什么:

  1. 使用库RxBinding来获取UI事件的反应式侦听器.这个observable会发出Object每次点击按钮.
  2. 虚拟API可观察.响应延迟模仿真实的API.
  3. 切换并映射从单击observable到API observable.如果在执行API调用期间发出新的单击对象,则取消旧调用并执行新调用.switchMap()运算符marble
  4. 您可能希望观察到的变化MainThread.