Как запустить doOnSubscribe на MainThread в этом случае - PullRequest
0 голосов
/ 03 февраля 2020

Я хочу выполнить блок 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 () запускается также в потоке пользовательского интерфейса, и я получаю ошибку NetworkOnMainThreadException. Как настроить планировщики так, чтобы doOnSubscribe выполнялась в основном потоке, а getProfile () запускалась в потоке ввода-вывода

1 Ответ

0 голосов
/ 03 февраля 2020

Добавьте .subscribeOn(Schedulers.io) к вашему .getProfile() вызову так, .getProfile().subscribeOn(Schedulers.io).observeOn(AndroidSchedulers.mainThread().doOnSubscribe()

Вот как это делается в java, я думаю, Kotlin имеет то же самое.

.doOnSubscribe{} вызывает что-то, что нужно сделать перед выполнением задачи

.subscribeOn() сообщает, какой поток должен выполнить работу над

...