【问题标题】:How to cancel request using merge如何使用合并取消请求
【发布时间】:2016-09-16 06:22:40
【问题描述】:

实际上,我在我的项目中使用的是 RxAndroid、Retrofit2.0 和 Okhttp 3.2.0。 我正在使用 Observable.merge 调用多个请求以上传文件。 有什么解决方案可以取消一个独特的请求吗?我知道我可以使用 subscription.unsubscribe() 但它会取消所有任务。

我使用了像 client.dispatcher.get(0).cancel() 这样的 okhttp 方法,但是它给我抛出了一个像 Canceled 这样的 Io 异常,它会取消所有任务。

您是否有适当的方法来仅取消选定的请求?谢谢

【问题讨论】:

    标签: ioexception retrofit2 rx-android okhttp3


    【解决方案1】:

    您可以将 takeUntil(Observable a) 附加到您的每个组成 Observable 并使用“控制”可观察对象选择性地取消它们。例如

    PublishSubject<Object> control1 = PublishSubject.create();
    PublishSubject<Object> control2 = PublishSubject.create();
    
    Observable<T> cancellableRestrofitObservable1 = retrofitObservable1.takeUntil(control1.asObservable());
    Observable<T> cancellableRestrofitObservable2 = retrofitObservable2.takeUntil(control2.asObservable());
    
    Observable<T> mergedObservable = Observable.merge(cancellableRestrofitObservable1,cancellableRestrofitObservable2);
    
    // To cancel retrofitObservable1
    control1.onNext("cancel");  
    

    【讨论】:

    • 嗨约翰,我想同时提出多个请求
    【解决方案2】:

    它运作良好。这是代码:

                    PublishSubject control = PublishSubject.create();
                    publishSubjectMap.put(position, control);
                    Observable<Response<Upload>> cancellableRestrofitObservable = dropboxapi.uploadImage(requestBody, params, position)
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .takeUntil(control.asObservable());
                    observables.add(cancellableRestrofitObservable);
    
    
            Observable<Response<Upload>> mergedObservable = Observable.merge(observables);
    

    //取消 publishSubjectMap.get(event.getPosition()).onNext("cancel");

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-22
      • 2015-03-14
      • 1970-01-01
      • 2014-04-07
      • 2019-05-13
      • 2011-10-15
      • 1970-01-01
      相关资源
      最近更新 更多