2015-11-02 11 views
6

Używam RxJava z Retrofit 2.0 na Androida dla żądań sieciowych.RxJava onCompleted i onTerminate na głównym wątku

Kiedy tworzę obserwowalny, dodaję do niego następujące:

observable = observable 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribeOn(Schedulers.io()) 
    .unsubscribeOn(Schedulers.io()) 

Następnie jeśli dodać:

observable = observable.doOnTerminate(new Action0() { 
       @Override 
       public void call() { 
        Log.d("OBS", "[" + Thread.currentThread().getName() + "] onTerminate"); 
       } 
      }); 

lub podobny do doOnError i doOnCompleted wywołania zwrotne są wykonywane na wątek IO, podczas gdy doOnNext jest wykonywany na głównym wątku.

Jednak tak naprawdę chcę, aby wszystkie wywołania zwrotne trafiły do ​​głównego wątku, ale wykonanie powinno pozostać w wątku IO.

Czy jest to eleganckie rozwiązanie bez konieczności ręcznego owijania implementacji blokiem, aby opublikować coś w głównym wątku?

+0

autobusy Wykorzystanie zdarzeń i pisać w wątku UI? –

Odpowiedz

8

Należy umieścić wywołania zwrotne zanim observeOn więc oni pozostać na swoim poprzednim wątku:

Observable.range(1, 10) 
.subscribeOn(Schedulers.io()) 
.doOnTerminate(() -> System.out.println(Thread.currentThread())) 
.map(v -> v + 1) 
.observeOn(AndroidSchedulers.mainThread()) 
.map(v -> Thread.currentThread() + "/" + v) 
.doOnNext(v -> Log.d("OBS", v)) 
.subscribe(); 
Powiązane problemy