【问题标题】:How to cancel a call with RxJava2?如何取消与 RxJava2 的通话?
【发布时间】:2019-04-14 03:18:29
【问题描述】:

我正在使用 RxJava2 和 Retrofit。在我的片段中,我请求上传一个本地文件:

Disposable disposable = mApi.requestUpload(file)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(response -> {
            toast("success");
        }, throwable -> {
            toast("failed");
        });
mCompositeDisposable.add(disposable);

然后,清除onDestroyView()中的所有一次性物品

@Override
public void onDestroyView() {
    mCompositeDisposable.clear();
    super.onDestroyView();
}

但是我使用Charles查看所有请求,发现在我完成片段后请求仍在执行一段时间后文件仍然上传成功

片段关闭时如何取消调用?

【问题讨论】:

  • 您使用的是哪个 Retrofit 版本。听起来改造没有正确取消上传。
  • 改造2.4.0版
  • @EbnZhang 你检查我的答案了吗?

标签: android retrofit rx-java2


【解决方案1】:

使用disposable.dipose() 取消您的通话。

【讨论】:

  • mCompositeDisposable.clear(); 应该处理并清除所有添加的Disposables。我很确定 disposable.dispose() 被调用了。
【解决方案2】:
  1. 定义一次性

    private io.reactivex.disposables.Disposable mDisposable;

  2. 分配给您的服务

    mService.getResults(query)
                .observeOn(AndroidSchedulers.from(Looper.getMainLooper(), true))
                .subscribeOn(Schedulers.io())
                .subscribe(new SingleObserver<Response<Model>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        /* required */
                        mDisposable = d;
                    }
    
                    @Override
                    public void onSuccess(Response<Model> response) {
                        dismissProgress();
                    }
    
                    @Override
                    public void onError(Throwable e) {
    
                    }
                });
    
  3. 调用下一行来解除/终止正在进行的 API 调用

     if (mDisposable != null)
        mDisposable.dispose(); 
    

你去。

更新

在你的情况下,应该是

@Override
public void onDestroyView() {
if (mCompositeDisposable!= null) // in case if you required-> if (mCompositeDisposable!= null && !mCompositeDisposable.isDisposed())
      mCompositeDisposable.dispose(); 
super.onDestroyView();
}

【讨论】:

  • 感谢您的回答!我已经使用像您的答案一样的代码,但仍然无法正常工作。 Dispose all Disposable 只是取消订阅当前调用的结果,而不是真正停止上传文件。而且我发现取消一个Http调用是不可靠的,所以也许我的问题不是关于RxJava......
  • @EbnZhang 在这种情况下为futurestud.io/tutorials/retrofit-2-cancel-requests
【解决方案3】:

将 RxJava 添加到 CompositeDisposable 然后在 onStop() 使用disposableRxJava.dispose()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2014-04-22
    • 2018-12-02
    相关资源
    最近更新 更多