15

我有这样的任务:

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

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

在指定的 Scheduler 上异步订阅 Observable 到这个 Observable

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

4

1 回答 1

40

您在下面看到的是稍微修改过的代码版本,其中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

于 2015-03-20T14:57:09.067 回答