How cancel task with retrofit and rxjava

14.1k views Asked by At

I have rest api.

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

I know, that okhttp has canceling functionality(by request object, by tag), but don't know how use it with retrofit and rxjava. What is the best way to realize canceling mechanism for network tasks with retrofit and rxjava?

2

There are 2 answers

2
Sergii Pechenizkyi On BEST ANSWER

You can use the standard RxJava2 cancelling mechanism Disposable.

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

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

Retrofit RxJava call adapter will redirect this to okHttp's cancel.

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

2
Ali Nem On

The chosen answer is for Rx Java 1 and is not valid for RxJava2. For the latter, you can use Disposable. Follow this:

  1. Define CompositeDisposable compositeDisposable=new CompositeDisposable() as a field in your Activity or Fragment in class.
  2. Define the api using Retrofit 2 as something like this:

    public Observable<YourPojo> callApiWithRetrofit() {
        return getService(YourApiService.class).callApi();
    }
    
  3. Define Disposableand add it to the compositeDisposable instance:

    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. Wherever you want the connection to be cancelled (e.g. onDestroy() method of your Activity or onDestroyView() of your Fragment) call mCompositeDisposable.clear();

Multiple disposables may be added to the CompostieDisposable above this way.