gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:08:12 27 4
gpt4 key购买 nike

我有这样的任务:

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.deferObservable.fromCallable

关于rx-java - 为什么订阅不在新线程中执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29169194/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com