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

时间:2015-03-20 14:41:26

标签: rx-java rx-android

我的任务是这样的:

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

其中getMessagesFromDb是方法同步获取消息,而不在内部进行多线程处理。根据subscribeOn方法的RxAndroid文档:

  

在指定的Scheduler

上异步订阅Observvers到此Observable

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

1 个答案:

答案 0 :(得分:37)

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