我有这样的任务:
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.defer
或 Observable.fromCallable
关于rx-java - 为什么订阅不在新线程中执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29169194/