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