RxJava 如何在旧版本的主线程上观察?我无权访问 AndroidSchedulers.mainThread()

Posted

技术标签:

【中文标题】RxJava 如何在旧版本的主线程上观察?我无权访问 AndroidSchedulers.mainThread()【英文标题】:RxJava how to observe on mainThread in older versions? I dont have access to AndroidSchedulers.mainThread() 【发布时间】:2018-03-03 00:05:46 【问题描述】:

我正在使用 web3 构建一个项目。

web3j.ethGetBalance("0x2910543af39aba0cd09dbb2d50200b3e800a63d2", latestBlock)
            .observable()
            .subscribeOn(rx.schedulers.Schedulers.io())
            //This needs to be on the main thread!
            //But i only have access to rx.schedulers not androidSchedulers.mainThread()
            .observeOn(rx.schedulers.Schedulers.io())
            .subscribe(block -> 
                ethereumTV.setText(block.getBalance() + "");
            , error -> 
                error.printStackTrace();
            );

但是 web3 使用的是旧版本的 RxJava,我无法访问 mainThread 来观察它(更新文本视图等)

有什么想法吗?

【问题讨论】:

compile 'io.reactivex:rxandroid:1.2.1' /* 因为 RxAndroid 版本很少而且相差甚远,所以建议您也/ /明确地依赖 RxJava 的最新版本来修复错误和新功能。* /compile 'io.reactivex:rxjava:1.1.6' 这是我的问题 -> 'rx.Observable' 中的 'observeOn(rx.Scheduler)' 不能应用于 '(io.reactivex.Scheduler)' 如果您无法添加rxandroid 依赖项来获取AndroidSchedulers,那么您可能必须构建自己的Scheduler。无论如何,主线程调度程序只是 handler.post(...) 的一个包装器。 找出你的rx版本,看看有没有对应的rxandroid版本,包名一样 你需要使用rx.android.AndroidSchedulers.mainThread() 【参考方案1】:
compile 'io.reactivex:rxandroid:1.2.1' // <-- this is needed
compile 'io.reactivex:rxjava:1.1.6'

那么你就可以得到

在'rx.Observable'中不能应用到'(io.reactivex.Scheduler)'

在什么情况下做

rx.android.AndroidSchedulers.mainThread()

【讨论】:

但从技术上讲,您也可以使用 RxJava2Interop 库将 rx.Observable 转换为 io.reactivex.Observable

以上是关于RxJava 如何在旧版本的主线程上观察?我无权访问 AndroidSchedulers.mainThread()的主要内容,如果未能解决你的问题,请参考以下文章

如何在可观察线程结束之前停止应用程序?

RxJava 是如何实现线程切换的(上)

RxJava 是如何实现线程切换的(上)

RxJava入门

浅谈RxJava源码解析(观察者),创建(createfromjust),变换(MapflatMap)线程调度

减少RxJava中多余的线程调度