android - 在这种情况下如何在 MainThread 上运行 doOnSubscribe
问题描述
我想在主线程上执行 doOnSubscribe 块。我正在尝试这个:
fun test(){
Single
.fromCallable {
print(Thread.currentThread())
getCachedProfile()
}
.observeOn(AndroidSchedulers.mainThread())
.flatMap {
print(Thread.currentThread())
api
.getProfile()
.doOnSubscribe {
print(Thread.currentThread())
}
.observeOn(Schedulers.io())
.map {
print(Thread.currentThread())
it.profile
}
.map { it.id }
.flatMap { photoId ->
print(Thread.currentThread())
api
.getPhotos(photoId)
.map { it.toDomain() }
}
}.subscribeOn(Schedulers.io())
.observeOn(AndroidSchdulers.mainThread())
}
doOnSubscribe 在主线程上运行,但 .getProfile() 也在 UI 线程上运行,我收到一个错误 NetworkOnMainThreadException。如何设置调度程序,使 doOnSubscribe 在主线程上执行,getProfile() 在 IO 线程上运行
解决方案
添加.subscribeOn(Schedulers.io)
到您的.getProfile()
通话中,.getProfile().subscribeOn(Schedulers.io).observeOn(AndroidSchedulers.mainThread().doOnSubscribe()
这就是它在java中的完成方式,我想Kotlin也有。
.doOnSubscribe{}
在任务执行之前调用某事做
.subscribeOn()
告诉在哪个线程上进行工作
推荐阅读
- r - 聚合 R 中特定变量名称的行
- android - 更改 searchView 提示文本颜色
- python-3.x - 如何使用 selenium python send_keys 将表格数据框发送到网页的文本区域?
- laravel - 当 index.php 不在 URL 中时,Laravel 8 强制下载而不是在 wamp 上执行 PHP 文件
- c# - 我要发送电子邮件,但错误提示无法发送电子邮件我的代码有什么问题
- vmware - 如何从 vCenter Server Appliance 中清除旧指纹
- javascript - 按住 shift+enter 键触发事件
- nginx - 如何为 Rasa 聊天机器人设置 HTTPS?
- flutter - 根据父主题数据的不同部分设计一个颤振小部件
- c# - 从 menuitem c# 中删除复选标记