Mam ten prosty interfejs API retrofit2, który zawiera
interface Api {
@GET(BuildConfig.END_POINT) Observable<Response> fetchData();
}
Więc wszystko jest w porządku, kiedy robię nową prośbę ale powiedzmy, że odpalam żądanie i natychmiast wypisuję się z subskrypcji, a następnie próbuję uruchomić nowe żądanie, które nic nie zwraca.
W kodzie wygląda to tak:
w Activity :: onPause wykonuję subskrypcję, a w Activity :: onResume ponownie uruchamiam żądanie.
Moja prośba wygląda mniej więcej tak:
api.fetchData()
.timeout(30,TimeUnit.SECONDS)
.doOnNext(new Action1<Response>() {
@Override public void call(Response response) {
list = response.getDataForList();
}
}).flatMap(new Func1<Response, Observable<List<Object>>>() {
@Override public Observable<Object>> call(Response response) {
return Observable.just(list);
}
});
Kiedy próbowałem go debugować, wywołanie zostało wykonane, ale funkcja doOnNext () nie została wywołana. Żadna z metod cyklu życia nie jest wywoływana.
I tylko dla wyjaśnienia stąd, zwracam po prostu to, co obserwowalne, którego używam gdzie indziej, gdzie obserwuję w głównym wątku i subskrybuję IO.
Odpowiedzi:
2 dla odpowiedzi № 1Nie używaj doOnNext, po prostu mapuj. I spróbuj przyzwyczaić się do używania lambd, spraw, aby Twój kod był czytelny.
api.fetchData()
.timeout(30,TimeUnit.SECONDS)
.map(response -> response.getDataForList())
.flatMap(list -> Observable.just(list));
Teraz jako koncepcja, za każdym razem, gdy jakiś obserwatorsubskrybuj to obserwowalne, zużyj przedmioty, a następnie obserwowalne automatycznie anuluj subskrypcję obserwatora. Więc nie musisz się martwić o rezygnację z subskrypcji.
Możesz zobaczyć kilka praktycznych przykładów tutaj. https://github.com/politrons/reactive