Android: как правильно восстановить состояние после того, как приложение было убито ОС

214
25 июля 2017, 17:19

Допустим, что у нас есть приложение с одной кнопкой - отправить запрос на добавление сообщения в чат. По нажатию на нее у нас появляется на экране лоадер, и отсылается запрос на сервер.

Пока выполняется запрос, у нас может произойти событие:

  1. Смена ориентации экрана
  2. Приложение свернули -> запрос (не)выполнился -> приложение развернули
  3. Приложение свернули -> запрос не выполнился -> приложение было убито ОС
  4. Приложение свернули -> запрос выполнился -> приложение было убито ОС

С первыми двумя пунктами все понятно - сохраняем состояние в onSaveInstanceState и восстанавливаем в onRestoreInstanceState. Сам запрос к серверу живет в интеракторе, и соответственно не уничтожается при уничтожении активити, поэтому после переворота - узнаем выполняется ли еще запрос. Если да - тогда подписываемся на ответ, если уже выполнился - получаем результат.

Третий пункт тоже нормально укладывается в логику - после восстановления обнаружим, что запроса в интеракторе вообще нет и снова создаем новый запрос к серверу.

А вот что делать с четвертым пунктом мне не понятно. Необходимо сохранить и состояние, что запрос выполнился, и результат этого запроса. Однако onSaveInstanceState уже выполнился, и добавить данные в бандл, вроде как, мы уже не можем. В тоже время, городить кучу моделей для каждого запроса+состояния и тем более хранить это все в БД - кажется каким-то оверхедом.

Может быть кто-нибудь сможет мне рассказать, как же правильно обработать такую ситуацию? Или может быть я вообще неправильно построил архитектуру и надо мыслить в другую сторону?

Answer 1

Вам нужно где-то глобально хранить что-то простое типа timeStamp, который будет обновлять интерактор при успешном завершении.

Соответственно в onRestoreInstanceState считываете timeStamp начала запроса и сравниваете с глобальным timeStamp. Делаете выводы.

Самое простое, что пришло в голову.

READ ALSO
Почему RequestDispatcher не меняет url в строке браузера?

Почему RequestDispatcher не меняет url в строке браузера?

Есть фильтр который передает управление определенному сервлету таки образом:

196
Как завершить проект в Android Studio?

Как завершить проект в Android Studio?

Как из проекта в Android Studio сделать apk-файл для скачивания на другие устройства?

416
Ошибка со StreamingConnection в Hive

Ошибка со StreamingConnection в Hive

Добрый день! Пытаюсь освоить StreamingConnection в Hive по документации

226