rx-java - 为什么订阅不在新线程中执行?

标签 rx-java rx-android

我有这样的任务:

Observable.just(getMessagesFromDb()).
    subscribeOn(Schedulers.newThread()).
    observeOn(AndroidSchedulers.mainThread()).
    subscribe(incomingMessages -> {
    //do something
    });

哪里getMessagesFromDb是同步获取消息的方法,内部没有多线程。根据 subscribeOn 方法的 RxAndroid 文档:

Asynchronously subscribes Observers to this Observable on the specified Scheduler



还有我的问题 - 为什么在主线程上执行数据库请求?如何异步执行?

最佳答案

您在下面看到的是对您的代码稍加修改的版本 getMessagesFromDb()调用以将返回值分配给变量:

 Object data = getMessagesFromDb();
 Observable.just(data).
    subscribeOn(Schedulers.newThread()).
    observeOn(AndroidSchedulers.mainThread()).
    subscribe(incomingMessages -> {
      //do something
    });

正是这样Observable.just作品,和 getMessagesFromDb()确实在主线程中调用(就像您在主线程中调用它一样)。

您必须使用 Observable.fromCallable 推迟它方法如下:
Observable.fromCallable(() -> getMessageFromDb()).
           subscribeOn(Schedulers.newThread()).
           observeOn(AndroidSchedulers.mainThread()).
           subscribe(incomingMessages -> {
              //do something
           });

请注意,您可以使用 Observable.defer而不是 Observable.fromCallable ,但它有点复杂:
Observable.defer(() -> Observable.just(getMessageFromDb()))

此响应的先前版本使用 Observable.create .但是用这种方法构建一个 Observable 很复杂。尝试总是更喜欢 Observable.deferObservable.fromCallable

关于rx-java - 为什么订阅不在新线程中执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29169194/

相关文章:

java - 从 Observable<List<String>> 返回 List<String>

java - RxJava Observable 在第一次发射时收到通知

android - 使用 REST 从 firebase 检索信息并使用 Retrofit 和 RxJava 进行解析时出现问题

android - 如何使用 RxAndroid 将流正确拆分为 4 个操作?

rx-java - RxJava 2-Observable.flatMapSingle澄清

java - 取消 Observable 的执行 (RxJava 1)

rx-java - 接收 : a zip-like operator that continues after one of the streams ended?

android - 一次发射一个项目,与之交互直到满足条件,然后继续下一个项目

android - 404 - 使用 Retrofit2 和 RXJava2 调用 API 时

android - Rxjava 对象过滤列表