Как уже упоминали @fraggjkee и @EpicPandaForce, проблема здесь:
(application as? App)?.relayPages
?.doAfterNext{
hideLoading()
}
В чем проблема: Android «Только исходный поток, создавший иерархию представлений, может коснуться его просмотров
Эта проблема возникает, когда кто-то пытается обновить состояние пользовательского интерфейса из потока, отличного от пользовательского интерфейса. UI-eventl oop является однопоточным. Поэтому запрещено, чтобы другие потоки обновляли UI-состояние (например, свойства просмотра и др. c.)
Почему «ObserveOn» не работает?
(application as? App)?.relayPages
?.doAfterNext{
hideLoading()
}
?.observeOn(AndroidSchedulers.mainThread())
ObserveOn переключает поток с одного оператора на другой в наблюдаемом. Когда relayPages выдает значение, оно будет проходить через doAfterNext в любом заданном потоке, скорее всего, в потоке-подписчике. После прохождения doAfterNext exmit будет go через ObserveOn-operator. Вот тут и происходит маг c. В этом операторе действие emit (onNext) будет помещено в очередь как запускаемое в UI-eventl oop (AndroidSchedulers # mainThread).
Для получения дополнительных инструкций, пожалуйста, посмотрите это объяснение: http://tomstechnicalblog.blogspot.de/2016/02/rxjava-understanding-observeon-and.html
Проблема
Оператор #doAfterNext вызывается из потока, не относящегося к пользовательскому интерфейсу, который пытается изменить некоторое состояние пользовательского интерфейса.
Разрешение
Все изменения UI-состояния должны вызываться из UI-потока. Поэтому вы должны убедиться, что это так.
(application as? App)?.relayPages
// observeOn switches the thread from X to the UI-eventloop
?.observeOn(AndroidSchedulers.mainThread())
// hideLoading is called from UI-eventloop, everything should be fine
?.doAfterNext{
hideLoading()
}
Сводка
ObserveOn должен быть помещен в цепочку операторов перед UI-состоянием изменено.