2015-11-02 66 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();