为什么订阅不在新线程中执行?
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.defer
或 Observable.fromCallable
我有这样的任务:
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.defer
或 Observable.fromCallable