2015-02-11 4 views
6

Istnieją sprzeczne informacje na temat tego, kiedy i czy należy użyć opcji subscribeOn z funkcją Retrofit.Używanie subskrybowania z Retrofitem

Here is an answer mówiąc, że nie wolno używać subscribeOn.
Here is an answer wydaje się sugerować, że subscribeOn nie ma dobrego domyślnego zestawu.
Here is example code przy użyciu subscribeOn.

Tak, raz na zawsze, kiedy należy użyć subscribeOn iz jakiego wątku? Jakie są możliwe konsekwencje używania lub nie używania subscribeOn?

apiService.issueRequest() 
    // Is this useful? Required? Bad practice? 
    .subscribeOn(Schedulers.io()) 
    // Do actions on main thread 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(new Action1<Response>() { 
     @Override public void call(Response response) { 
      handleResponse(response); 
    }); 
+1

Po połączeniu tych dwóch bibliotek zdecydowałem się je rozdzielić. Retrofit po prostu zawija zwrot w "Observable", więc robię to sam. To pozwala mi mieć zarówno asynchroniczne (dla aplikacji) i zsynchronizować (do testowania) interfejsy API. – quinnjn

+1

Jednym z obszarów, w którym użycie 'subscribeOn' z doposażeniem jest niezwykle pomocne w przechwytywaczu żądań. Na przykład, jeśli potrzebujesz udekorować nagłówek za pomocą tokena uwierzytelniania, często musisz je pobrać w wątku tła. GoogleAuthUtil, na przykład, zostanie zniszczony, jeśli zażądano tokena w głównym wątku. Mam nadzieję, że nie zawsze będzie tak, aby uniknąć dodatkowego opakowania. – lopar

Odpowiedz

6

W obecnej wersji (1.9.0) Retrofit, Modernizacja wykorzystać swój wykonawcę do wykonywania połączeń HTTP i nie używaj the executor backed by the schedulers daną metodą subscribeOn.

W twoim przypadku program planujący zostanie użyty tylko do wykonania kodu, który doda twoje połączenie http do executora używanego przez modernizację. (Więc to trochę bezużyteczne ...)

ALE, w odniesieniu do rzeczywistego kodu z Retrofit on Github, przystanek modernizacji wykorzystać jego wykonawcę, więc może to być możliwe, aby stosować harmonogram RxJava zamiast.