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

问题描述 投票:17回答:2

我有休息api。

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

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

retrofit reactive-programming rx-java okhttp
2个回答
26
投票

您可以使用标准的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


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. 定义Disposableand将其添加到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()Activity方法或onDestroyView()Fragment),请调用mCompositeDisposable.clear();

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

© www.soinside.com 2019 - 2024. All rights reserved.