Как не показывать индикатор загрузки, когда данные уже получены - PullRequest
0 голосов
/ 26 февраля 2020

Ситуация:

  • Мы выполняем некоторые запросы API (rx Single s) в ViewModel, используя Retrofit. Мы показываем индикатор загрузки в doOnSubscribe.

  • Теперь мы перемещаемся вперед и назад. Это приводит к повторной подписке наблюдателя (фрагмент / представление).

  • Вызовы API больше не выполняются, но вызывается doOnSubscribe, в результате чего индикатор прогресса отображается в течение очень короткого момента.

Обратите внимание, что результаты не сохраняются. Единственный кеш - это данные в памяти (сам Single).

Вопрос:

Как показать индикатор только при выполнении запросов?

Возможные решения:

  • Сделайте так, чтобы Retrofit возвращал объект состояния (запечатанный класс с «запущено», «загрузка», «результат (значение)» или аналогичный) вместо полезной нагрузки напрямую. Я предполагаю, что это может быть сделано в некотором промежуточном программном обеспечении, но не знаю, что и как.
  • Показывать загрузчик, когда запрос занимает много времени, например, более секунды. Это легче реализовать, но не кажется идеальным, так как в скором времени не будет ничего, и мерцание станет более вероятным, поскольку оно может закончиться sh сразу после начальной задержки.
  • Что-то проще?

1 Ответ

1 голос
/ 26 февраля 2020

Не видя ваш код, трудно ответить на этот вопрос, но позвольте мне попробовать. Кажется правильным, что индикатор отображается в doOnSubscribe() и удаляется при любом вызове, когда завершается выборка данных, я полагаю, метод onResult() или onSuccess() (я давно работал с Rx). Поэтому, когда вы переходите к указанному фрагменту / операции c, вызывается метод, так что это правильно.

Таким образом, чтобы не допустить, чтобы вы могли

a) просто показать индикатор загрузки с задержкой, чтобы он не был виден, когда результат приходит из памяти (не так здорово, но точно работает)

b) убедитесь, что вы не используете повторно одиночные данные, например, очистив их при переходе (это, вероятно, приведет к вызову API каждый раз, что не нужно, так что это тоже не так уж и здорово)

c) не отображать индикатор в doOnSubscribe(), а только при выполнении вызова API, поэтому он не будет отображаться, когда результаты уже локальны.

d) сохраните результаты в другом поле, чтобы вы не полагались на одиночный код или не добавляли флаг, когда вы уже выполнили вызов API (зависит от вашего кода, если здесь есть смысл)

...