在这种情况下如何在 MainThread 上运行 doOnSubscribe

How run doOnSubscribe on MainThread in this case

提问人:SSHEX 提问时间:2/4/2020 更新时间:2/4/2020 访问量:281

问:

我想在主线程上执行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,并在 IO 线程上运行 getProfile()

Android NetworkOnMainThread

评论


答:

0赞 DevJZ 2/4/2020 #1

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

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

.doOnSubscribe{}在执行任务之前调用要执行的操作

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