首页 > 解决方案 > 在这种情况下如何在 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 线程上运行

标签: androidnetworkonmainthread

解决方案


添加.subscribeOn(Schedulers.io)到您的.getProfile()通话中,.getProfile().subscribeOn(Schedulers.io).observeOn(AndroidSchedulers.mainThread().doOnSubscribe()

这就是它在java中的完成方式,我想Kotlin也有。

.doOnSubscribe{}在任务执行之前调用某事做

.subscribeOn() 告诉在哪个线程上进行工作


推荐阅读