我的任务是这样的:
Observable.just(getMessagesFromDb()).
subscribeOn(Schedulers.newThread()).
observeOn(AndroidSchedulers.mainThread()).
subscribe(incomingMessages -> {
//do something
});
其中getMessagesFromDb
是方法同步获取消息,而不在内部进行多线程处理。根据subscribeOn方法的RxAndroid文档:
在指定的Scheduler
上异步订阅Observvers到此Observable
还有我的问题 - 为什么数据库请求在主线程上执行?如何异步进行?
答案 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.defer
或Observable.fromCallable