RxJava onCompleted和onTerminate在主线程上

时间:2015-11-02 01:33:48

标签: android retrofit rx-java rx-android

我在Android上使用RxJava和Retrofit 2.0进行网络请求。

当我创建observable时,我将以下内容添加到其中:

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线程上。

有没有一个优雅的解决方案,而不必手动用块来包装我的实现,以便将东西发布到主线程?

1 个答案:

答案 0 :(得分:10)

你应该在任何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();