如何使用合并取消请求

How to cancel request using merge

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

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

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

您可以将 takeUntil(Observable a) 附加到每个构成 Observable 并使用 "control" 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");  

它运作良好。这是代码:

                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");