如何使用合并

时间:2016-05-19 11:38:22

标签: ioexception retrofit2 rx-android okhttp3

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

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

您是否有正确的方法来取消所选的请求?谢谢

2 个答案:

答案 0 :(得分:0)

你可以附加一个takeUntil(Observable a)使用你的每个成分Observables并使用"控制"可观察到选择性取消它们。例如

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

答案 1 :(得分:0)

它运作良好。这是代码:

                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( “取消”);