主线程上的 RxJava onCompleted 和 onTerminate
RxJava onCompleted and onTerminate on main thread
我在 Android 上使用 RxJava 和 Retrofit 2.0 处理网络请求。
当我创建可观察对象时,我向其中添加了以下内容:
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");
}
});
或类似 doOnError
和 doOnCompleted
回调在 IO 线程上执行,而 doOnNext
在主线程上执行。
然而,我真正想要的是所有回调都转到主线程,但执行应该留在 IO 线程。
是否有一个优雅的解决方案,而无需手动将我的实现包装到 post 主线程的某些内容?
您应该将回调放在任何 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();
我在 Android 上使用 RxJava 和 Retrofit 2.0 处理网络请求。
当我创建可观察对象时,我向其中添加了以下内容:
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");
}
});
或类似 doOnError
和 doOnCompleted
回调在 IO 线程上执行,而 doOnNext
在主线程上执行。
然而,我真正想要的是所有回调都转到主线程,但执行应该留在 IO 线程。
是否有一个优雅的解决方案,而无需手动将我的实现包装到 post 主线程的某些内容?
您应该将回调放在任何 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();