【问题标题】:RxAndroid 3 main threadRxAndroid 3 主线程
【发布时间】:2020-02-13 07:19:33
【问题描述】:

我正在尝试在 Rx3 中找到 subscribeOn 的主线程

Single.just(getHeavyData())
                                .subscribeOn(Schedulers.io())
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribe(new Consumer<Data>() {
                                    @Override
                                    public void accept(Data d) throws Throwable {
                                        setAdapters(d);
                                    }
                                });

AndroidSchedulers.mainThread() - 与全新的 RX3 不兼容

Gradle 导入:implementation "io.reactivex.rxjava3:rxjava:3.0.0-RC3"

我们如何找到主线程以便对 UI 进行更改?

【问题讨论】:

  • 顺便说一句,如果您使用Single.just(),您的heavyData() 将立即执行(在创建单个对象时),而不是在订阅时(这是您想要的)。请改用Single.fromCallable()

标签: android user-interface rx-java threadpool


【解决方案1】:

AndroidSchedulers.mainThread() 不是 Rx Java 1,2 或 3 的一部分。它是 RxAndroid 库的一部分。将 RxAndroid 依赖添加到你的项目中,你就会得到这个方法。

RxAndroid 仍然使用 RxJava2。在库的创建者发布更新之前,这个问题仍然存在。

新的包结构已随 3.0.0-RC2 一起发布,并且有一个支持库,以便 v2 和 v3 可以相互通信,而不会出现以前隐藏或明显的编译/运行时问题。 这也意味着模块覆盖技巧不再起作用,因此您必须手动桥接 AndroidScheduler 或从 Retrofit 中使用的 v2 源转换,直到这些(和许多其他)库开始支持 v3。

请参考thisthis

【讨论】:

  • 已经使用 import io.reactivex.android.schedulers.AndroidSchedulers;但是调用 observeOn 确实需要 io.reactivex.rxjava3.core.Scheduler
  • 请在 build.gradle 中分享您的依赖项
  • implementation "io.reactivex.rxjava3:rxjava:3.0.0-RC3" implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' 问题中的示例代码使用 Rx3
  • 错误信息是什么。你也可以在这个文件中分享你的导入。你是从头开始研究 Rx3 还是在这个项目中从 Rx2 升级到 Rx3
  • 尝试在新项目中使用 Rx3。错误是error: incompatible types: io.reactivex.Scheduler cannot be converted to io.reactivex.rxjava3.core.Scheduler
【解决方案2】:

这是导入的问题。 在意识到我需要引用 RxJava3 之前,我遇到了类似的问题。 将这些导入用于调度程序和一次性单个观察者


    import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
    import io.reactivex.rxjava3.observers.DisposableSingleObserver;
    import io.reactivex.rxjava3.schedulers.Schedulers;

此外,如果您的服务具有返回单次使用的方法

    import io.reactivex.rxjava3.core.Single;

【讨论】:

    【解决方案3】:

    有一个类似的问题,兼容性问题来自于 Single 的导入。即使我使用的是 RxJava3 库和 RxAndroid3,我仍然在使用:

    import io.reactivex.Single
    

    但在将 Single 指向时已解决:

    import io.reactivex.rxjava3.core.Single
    

    【讨论】:

      【解决方案4】:

      检查你的导入,也许你正在导入类似的东西:

      implementation 'io.reactivex.**rxjava2**:rxandroid:x.y.z'
      

      但你应该导入类似的东西:

      implementation 'io.reactivex.**rxjava3**:rxandroid:3.0.0'(查看最新版本)

      解决了我的问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-23
        相关资源
        最近更新 更多