У меня странная проблема, которая, похоже, связана с Retrofit.Что происходит после завершения запроса на доработку?
Предположим, что у меня есть пример приложения, в котором есть только одно действие. Он также имеет windowBackground
, установленный на красный цвет в styles.xml
. Теперь я сделать что-то подобное в onCreate
:
public void onCreate() {
retrofit.foo()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ response ->
// ignore
}, { error ->
finish()
})
}
Чтобы проверить это, я бегу это приложение без подключения к Интернету, поэтому он всегда вызывает onError
.
Я ожидаю, что после запуска приложения он отобразит красный фон, попробует сделать запрос, а затем он назовет finish()
и активность будет закрыта. Функционально это работает нормально, но визуально есть странная проблема. Он показывает красный фон, затем он становится черным на мгновение, а затем снова красным, и, наконец, приложение закрыто.
Я попытался заменить вызов Retrofit простым наблюдаемым, который испускает ошибку после некоторой задержки, и она работала правильно (без черного фона). Вот почему я думаю, что это связано с Retrofit. Поведение такое же, если я делаю onErrorResumeNext
и звоню finish()
в onNext
. Но если у меня есть подключение к Интернету, и звонок преуспел, тогда нет черного фона. Кажется, что-то происходит, когда происходит ошибка не-http.
После некоторого расследования я заметил, что это, вероятно, не ошибка OkHttp. Я завернул OkHttp-вызов в Obsevable.create
, и когда он выпустил ошибку, я позвонил finish()
. В этом случае нет черного экрана. Только при использовании Retrofit. Я также пробовал использовать Retrofit без RxJava - просто call.enqueue
, и он работает неправильно (отображается черный экран).
Я использую Retrofit 2.0.2 с адаптером RxJava. И я воспроизвел эту проблему на Android 5.1.1.
Итак, красный фон установлен в макете xml? Вы устанавливаете черный фон по своему усмотрению в любом месте приложения? Возможно ли, что черный bg показывает, когда вы пытаетесь запустить слишком много в основном потоке? –
Фон устанавливается в тему приложения, используя атрибут windowBackground. У операции вообще нет макета. Возможно, вы правы, и в основной теме слишком много работы, но это не моя работа. У меня нет другого кода, кроме опубликованного выше. –
Попробуйте изменить параметры 'subscribe', чтобы ничего не делать и посмотреть, все еще происходит. Если это все равно, то это механизм синхронизации наблюдаемого наблюдателя, затормозивший основной поток. –