【问题标题】: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");