如何使用改造和 rxjava 取消任务

How cancel task with retrofit and rxjava

我休息api.

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

我知道,okhttp 具有取消功能(通过请求对象,通过标签),但不知道如何将它与 retrofit 和 rxjava 一起使用。用retrofit和rxjava实现网络任务取消机制最好的方法是什么?

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

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

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

改造 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

所选答案适用于 Rx Java 1,不适用于 RxJava2。对于后者,您可以使用 Disposable。按照这个:

  1. CompositeDisposable compositeDisposable=new CompositeDisposable() 定义为 Activity 或 class 中的 Fragment 字段。
  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(disposable);
    
  4. 无论您希望在何处取消连接(例如 ActivityonDestroy() 方法或 FragmentonDestroyView() 方法)调用 mCompositeDisposable.clear();

可以通过这种方式将多个一次性用品添加到上面的 CompostieDisposable 中。