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

zel*_*lla 19 reactive-programming rx-java retrofit okhttp

我有休息api.

@Get("/serveraction")
public Observable<String> myRequest(@Query("Data") String data);
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*kyi 30

您可以使用标准的RxJava取消机制订阅.

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

// later when not needed
d.dispose();
Run Code Online (Sandbox Code Playgroud)

Retrofit RxJava连接器会将此调用重定向到okHttp的取消.请参阅:https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava/src/main/java/retrofit2/RxJavaCallAdapterFactory.java#L102

  • 链接已经死了 (5认同)

Ali*_*Nem 5

所选答案适用于 Rx Java 1,对 RxJava2 无效。对于后者,您可以使用 Disposable。请按照以下步骤操作:

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

    public Observable<YourPojo> callApiWithRetrofit() {
        return getService(YourApiService.class).callApi();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 无论您希望在何处取消连接(例如onDestroy()您的方法ActivityonDestroyView()您的方法Fragment),请调用 mCompositeDisposable.clear();

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