Я работаю над своим первым приложением для Android. У него есть модель, которая сохраняется в базе данных по мере того, как пользователь вносит обновления.
Когда вызывается onSaveInsanceState
, я хочу сохранить идентификатор, который можно использовать для загрузки документа, над которым работал пользователь, из базы данных. Но это может произойти только после того, как документ полностью попал в базу данных. В некоторых случаях сохранение сложного документа может занять несколько секунд (я надеюсь, что это ускорится, когда я выполню весь подробный выход из системы, и в реальном использовании сложный документ будет создаваться пользователем поэтапно, каждый из которых будут сохранены в базе данных, поэтому маловероятно, что сложный документ нужно будет сохранять за один раз).
Теперь правило №1 многопоточности на Android — «не блокировать поток пользовательского интерфейса», поэтому, конечно, взаимодействие с БД происходит в отдельном потоке. Но мое понимание жизненного цикла Android заключается в том, что во многих случаях onSaveInstanceState вызывается, потому что система Android хочет завершить процесс. Это говорит о том, что я не могу позволить этому методу вернуться, пока поток БД не завершит сохранение документа (и на самом деле с моим текущим дизайном я на самом деле не знаю, что такое идентификационный номер документа, пока он не будет сохранен в БД, поэтому я даже не могу поместить это в пакет сохраненного состояния).
Уместно ли в этих обстоятельствах блокировать поток пользовательского интерфейса в ожидании выполнения задачи сохранения? Когда onSaveInstanceState
вызывается из-за уничтожения процесса, приложение больше не отображается на переднем плане, поэтому нет интерфейса, который мог бы перестать отвечать на запросы.
Но onSaveInstanceState
также вызывается, когда экземпляр Activity уничтожается обновлением конфигурации, что происходит при изменении ориентации экрана. Очень жаль, когда поворот экрана вбок ничего не дает в течение нескольких секунд. В этом случае процесс (и, следовательно, объем памяти) все еще существует, поэтому мне не нужно строго следить за тем, чтобы документ попадал в базу данных, если я могу просто сохранить ссылку на него в Bundle вместо его идентификатора. Но я не знаю, как отличить эти два случая.
Существует ли общепринятая практика для таких ситуаций? Должен ли я просто заблокировать поток, чтобы быть в безопасности? Могу ли я просто использовать обычные примитивы потоков Java для блокировки и ожидания? Есть ли что-то, что я могу сделать, чтобы не блокировать поток, но гарантировать, что задача сохранения будет завершена до того, как Android закроет процесс?
Все это также относится к onPause
, так как onSaveInstanceState
не обязательно будет вызываться.