Как отменить задачу с помощью модификации и rxjava

У меня есть rest api.

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

Я знаю, что okhttp отменяет функциональность (по запросу объекта, по тегу), но не знаю, как использовать его с модификацией и rxjava. Каков наилучший способ реализовать механизм отмены сетевых задач с помощью модификации и rxjava?

Ответ 1

Вы можете использовать стандартный механизм отмены RxJava Subscription.

Observable<String> o = retrofit.getObservable(..);
Subscription s = o.subscribe(...);

// later when not needed
s.unsubscribe();

Усовершенствованный соединитель RxJava перенаправит этот вызов на okHttp cancel. См. Здесь: https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava/src/main/java/retrofit2/RxJavaCallAdapterFactory.java#L102

Ответ 2

Выбранный ответ для Rx Java 1 и недействителен для RxJava2. Для последнего вы можете использовать одноразовый. Следуйте этому:

  • Определите CompositeDisposable compositeDisposable=new CompositeDisposable() как поле в классе Activity или Fragment в классе.
  • Определите api с помощью Retrofit 2 как-то вроде этого:

    public Observable<YourPojo> callApiWithRetrofit() {
        return getService(YourApiService.class).callApi();
    }
    
  • Определите 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);
    
  • Везде, где вы хотите, чтобы соединение было отменено (например, onDestroy() метод вашего Activity или onDestroyView() вашего Fragment) вызова   mCompositeDisposable.clear();

Несколько дополнительных расходных материалов могут быть добавлены в CompostieDisposable выше этого пути.