2015-11-02 9 views
6

Ich benutze RxJava mit Retrofit 2.0 auf Android für Netzwerkanforderungen.RxJava onCompleted und onTerminate auf Haupt-Thread

Wenn ich die beobachtbaren bin erstellen, füge ich folgendes vor:

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

Dann, wenn ich hinzufügen:

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

oder ähnlich für doOnError und doOnCompleted die Rückrufe werden ausgeführt auf der IO-Thread, während doOnNext auf dem Haupt-Thread ausgeführt wird.

Allerdings möchte ich wirklich, dass alle Callbacks zum Hauptthread gehen, aber die Ausführung sollte auf dem IO-Thread bleiben.

Gibt es eine elegante Lösung, ohne meine Implementierungen manuell mit einem Block zu umbrechen, um etwas an den Haupt-Thread zu posten?

+0

Verwenden Ereignis Busse und Post an UI-Thread? –

Antwort

8

sollten Sie Ihre Rückrufe platzieren, bevor eine observeOn so werden sie auf ihren vorherigen Thread bleiben:

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();