2015-11-02 33 views
6

我在Android上使用RxJava和Retrofit 2.0進行網絡請求。RxJava onCompleted和onTerminate在主線程上

當我創造了可觀的,我添加以下代碼行:

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

然後,如果我添加一個:

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

或爲doOnErrordoOnCompleted回調類似於執行上IO線程,而doOnNext在主線程上執行。

但是,我真正想要的是所有回調都轉到主線程,但執行應該停留在IO線程上。

有沒有一個優雅的解決方案,而不必手動包裝我的實現與塊將內容發佈到主線程?

+0

使用事件總線和張貼到UI線程? –

回答

8

你應該把你的回調之前的任何observeOn,這樣他們就會留下以前的線程上:

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