在Android UI线程上订阅

9

我刚开始接触RxJava,可能有一些非常基本的东西我忽略了。我创建了一个Observable,执行了一个长时间运行的I/O任务,就像这样。现在我想确保订阅者在Android UI线程上收到它的结果:

Observable.create(new ObservableOnSubscribe<Device>() {
    @Override
    public void subscribe(@io.reactivex.annotations.NonNull final ObservableEmitter<Device> e) throws Exception {
        //Long running task
    }
}).subscribeOn(Schedulers.io())

从上面可以看出,我已经在Schedulers.io()上执行了长时间运行的任务。那么如何切换回Android UI线程呢?


请查看 "observeOn" 操作符和 "rxAndroid" 库。 - Pavel Strelchenko
我知道observeOn。除了使用另一个库之外,还有其他的解决方法吗? - Dhruv Jagetiya
使用RxAndroid库。它只有1或2个方法,因此使用它没有任何缺点。 - Tim
当然,你还有另一种解决方案 - 你可以使用主线程looper实现自己的调度器。例如,可以看看RxAndroid =)但是,如果你有能力加载简单且轻量级的库,为什么要重新发明轮子呢? - Pavel Strelchenko
1个回答

16

你需要执行 observeOn(AndroidSchedulers.mainThread())


没有AndroidSchedulers类。 - Dhruv Jagetiya
3
你需要在gradle文件中导入RxAndroidcompile 'io.reactivex.rxjava2:rxandroid:2.0.1' - azizbekian
很有趣。我不太想再加入另一个库,但它似乎非常轻量级。 - Dhruv Jagetiya
如果您不想导入该库(但我建议您这样做),只需传递一个带有主循环器的调度程序构造即可。 - Mathieu Bertin
1
@MathieuBertin那么为什么还要使用RxAndroid呢? - Dhruv Jagetiya
因为它只是糖,但它非常有用且非常轻巧。此外,您必须实现自己的调度程序版本,否则可能无法正常工作,而不是使用“AndroidSchedulers”。 - Mathieu Bertin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接