【问题标题】:How run doOnSubscribe on MainThread in this case在这种情况下如何在 MainThread 上运行 doOnSubscribe
【发布时间】:2020-05-19 11:19:00
【问题描述】:

我想在主线程上执行 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线程上运行

【问题讨论】:

    标签: android networkonmainthread


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-06-19
      • 1970-01-01
      • 2016-07-27
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      相关资源
      最近更新 更多