Как отменить задачу с помощью модификации и 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 выше этого пути.