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

Why does subscribe not executed in a new thread?

我有这样的任务:

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() 为变量分配 return 值:

 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