2016-07-14 4 views
3

У меня странная проблема, которая, похоже, связана с 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.

+0

Итак, красный фон установлен в макете xml? Вы устанавливаете черный фон по своему усмотрению в любом месте приложения? Возможно ли, что черный bg показывает, когда вы пытаетесь запустить слишком много в основном потоке? –

+0

Фон устанавливается в тему приложения, используя атрибут windowBackground. У операции вообще нет макета. Возможно, вы правы, и в основной теме слишком много работы, но это не моя работа. У меня нет другого кода, кроме опубликованного выше. –

+0

Попробуйте изменить параметры 'subscribe', чтобы ничего не делать и посмотреть, все еще происходит. Если это все равно, то это механизм синхронизации наблюдаемого наблюдателя, затормозивший основной поток. –

ответ

0

Я думаю, что у вас может возникнуть проблема с анимацией активности. Попробуйте отключить анимацию активности с помощью

public void onCreate() { 
    retrofit.foo() 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe({ response -> 
      // ignore 
     }, { error -> { 
       finish(); 
       overridePendingTransition(0, 0); 
      } 
     }) 
} 
+0

Забыл упомянуть, что я уже пробовал :) –

Смежные вопросы