【问题标题】:RxJava onCompleted and onTerminate on main thread主线程上的 RxJava onCompleted 和 onTerminate
【发布时间】:2016-02-01 20:25:17
【问题描述】:

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

是否有一个优雅的解决方案,而不必手动用块包装我的实现以将某些内容发布到主线程?

【问题讨论】:

  • 使用事件总线并发布到 UI 线程?

标签: android retrofit rx-java rx-android


【解决方案1】:

您应该将您的回调放在任何 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多