2015-06-09 5 views
14

У меня есть ави.Как отменить задачу с модификацией и rxjava

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

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

ответ

20

Вы можете использовать стандартный механизм отмены 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

+0

FYI: Я уверен, что [ObservableCallAdapterFactory] (https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava/src/main/java/retrofit/ObservableCallAdapterFactory.java) в модификации -adpaters будет частью еще не выпущенного Retrofit 2.0 и в настоящее время не является частью Retrofit 1.9. Отмена подписки, описанная выше компанией @Sergii, по-прежнему приведет к тому, что ваш абонент не получит ответ, но как его отменить внутренне, будет менее чистым, и вы можете увидеть некоторые прерываемые потоком исключения (но они не будут разбивать ваше приложение). – Nick

+3

ссылка мертва –

+0

Спасибо. Обновлено. –

1

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

  1. Определить CompositeDisposable compositeDisposable=new CompositeDisposable() как поле в вашем Activity или Fragment в классе.
  2. Определение апи с помощью дооснащения 2, как-то вроде этого:

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

В комплект поставки CompostieDisposable можно добавить несколько одноразовых предметов.

+0

Важнейшей частью первоначального ответа (v1) является то, что он фактически отменяет запрос: '' 'Обновленный соединитель RxJava перенаправит этот вызов на okHttp-cancel. См. Здесь: '' '.. отсутствует в этом ответе (старая ссылка сейчас не работает) – minsk

Смежные вопросы