2015-06-09 21 views
14

Mam api odpoczynku.Jak anulować zadanie z modernizacją i rxjava

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

wiem, że okhttp jest anulowanie funkcjonalność (na żądanie obiektu, przez tag), ale nie wiem jak go używać z modernizacją i rxjava. Jaki jest najlepszy sposób na zrealizowanie mechanizmu anulowania dla zadań sieciowych za pomocą modernizacji i rxjava?

Odpowiedz

20

Można użyć standardowego mechanizmu anulowania RxJava Subscription.

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

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

Złącze RxJava Retrofit przekieruje to połączenie do anulowania OKHttp. Zobacz tutaj: https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava/src/main/java/retrofit2/RxJavaCallAdapterFactory.java#L102

+0

FYI: Jestem pewien, że [ObservableCallAdapterFactory] (https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava/src/main/java/retrofit/ObservableCallAdapterFactory.java) w modernizacji -adpaters będzie częścią niepublikowanej jeszcze wersji Retrofit 2.0 i obecnie nie jest częścią Retrofit 1.9. Anulowanie subskrypcji, jak opisano powyżej przez @Sergii, nadal będzie skutkowało brakiem odpowiedzi przez twojego subskrybenta, ale sposób jego anulowania wewnętrznie jest mniej czysty i możesz zobaczyć wyjątki przerwane wątkiem (ale nie powodują one awarii aplikacji). – Nick

+3

link jest martwy –

+0

Dzięki. Zaktualizowano. –

1

Wybrana odpowiedź dotyczy Rx Java 1 i nie jest poprawna dla RxJava2. W przypadku tego ostatniego można użyć jednorazowego użytku. Postępuj w ten sposób:

  1. Definiowanie CompositeDisposable compositeDisposable=new CompositeDisposable() jako pole w Activity lub Fragment w klasie.
  2. Zdefiniuj API używając Modernizacja 2 jak coś takiego:

    public Observable<YourPojo> callApiWithRetrofit() { 
        return getService(YourApiService.class).callApi(); 
    } 
    
  3. Define Disposable i dodać go do instancji 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. Gdziekolwiek chcesz połączenie ma być anulowane (np. onDestroy() metoda twojego Activity lub onDestroyView() twojego Fragment) wywołanie mCompositeDisposable.clear();

W ten sposób można dodać wiele materiałów jednorazowego użytku do urządzenia CompostieDisposable.

+0

Najważniejszą częścią oryginalnej odpowiedzi (v1) jest to, że faktycznie anuluje żądanie: '' 'Retrofit RxJava Connector przekieruje to połączenie do anulowania okHttp. Zobacz tutaj: '' '.. brakuje w tej odpowiedzi (stary link jest zepsuty) – minsk