如何通过改造和rxjava取消任务

时间:2015-06-09 08:52:03

标签: retrofit reactive-programming rx-java okhttp

我有休息api。

@Get("/serveraction")
public Observable<String> myRequest(@Query("Data") String data);

我知道,okhttp已取消功能(通过请求对象,按标签),但不知道如何使用它与改造和rxjava。使用改造和rxjava实现网络任务取消机制的最佳方法是什么?

2 个答案:

答案 0 :(得分:24)

您可以使用标准的RxJava2取消机制Disposable

Observable<String> o = retrofit.getObservable(..);
Disposable d = o.subscribe(...);

// later when not needed
d.dispose();

Retrofit RxJava调用适配器会将此重定向到okHttp的取消。

RxJava1:https://github.com/square/retrofit/blob/46dc939a0dfb470b3f52edc88552f6f7ebb49f42/retrofit-adapters/rxjava/src/main/java/retrofit2/adapter/rxjava/CallArbiter.java#L50-L53

RxJava2:https://github.com/square/retrofit/blob/46dc939a0dfb470b3f52edc88552f6f7ebb49f42/retrofit-adapters/rxjava2/src/main/java/retrofit2/adapter/rxjava2/CallEnqueueObservable.java#L92-L95

答案 1 :(得分:3)

所选答案适用于Rx Java 1,对RxJava2无效。对于后者,您可以使用Disposable。请遵循:

  1. CompositeDisposable compositeDisposable=new CompositeDisposable()定义为ActivityFragment中的字段。
  2. 使用Retrofit 2定义api,如下所示:

    public Observable<YourPojo> callApiWithRetrofit() {
        return getService(YourApiService.class).callApi();
    }
    
  3. 定义Disposable并将其添加到compositeDisposable实例:

    Disposable disposable = callApiWithRetrofit().subscribeOn(Schedulers.io()).observeOn(
            AndroidSchedulers.mainThread()).subscribeWith(
            new DisposableObserver<List<YourPojo>>() {
                @Override
                protected void onStart() {
                    super.onStart();
                }
    
                @Override
                public void onNext(@NonNull List<AlertAssetDTO> listResponse) {
    
                }
    
                @Override
                public void onError(@NonNull Throwable e) {
    
                }
    
                @Override
                public void onComplete() {
    
                }
            });
    mCompositeDisposable.add(alertAssetsDisposable);
    
  4. 您希望取消连接的任何位置(例如,onDestroy()的{​​{1}}或Activity onDestroyView()来电     mCompositeDisposable.clear();

  5. 可以通过这种方式将多个一次性物品添加到CompostieDisposable中。