onStartInstateState/onPause - Подождите, пока состояние не будет полностью сохранено, прежде чем разрешить завершение процесса

Я работаю над моим первым приложением для Android. Оно имеет модель, которая сохраняется в базе данных, когда пользователь делает обновления.

При вызове onStartInsureState необходимо сохранить идентификатор, который можно использовать для загрузки документа, над которым работал пользователь, из базы данных. Но это может произойти только после того, как документ полностью попадет в базу данных. В некоторых случаях сохранение сложного документа может занять несколько секунд (Я надеюсь, что это ускорится, как только я возьму весь подробный выход из системы, и при фактическом использовании сложный документ будет создаваться пользователем поэтапно, каждый из которых будет сохраняться в базе данных, поэтому для сложного документа вряд ли придется сохранять все в одном шаге).

Теперь правило многопоточности # 1 на Android - «не блокировать поток пользовательского интерфейса», поэтому взаимодействие с БД происходит в отдельном потоке. Но мое понимание жизненного цикла Android заключается в том, что во многих случаях onStartInstureState называется, потому что система Android хочет убить процесс. Это говорит о том, что я не могу позволить этому методу вернуться до тех пор, пока поток БД не завершит сохранение документа (и на самом деле с моим текущим дизайном я фактически не знаю, каков идентификационный номер документа, пока он не будет сохранен в БД, поэтому я даже не могу поместить его в пакет сохраненного состояния).

Целесообразно ли в этих обстоятельствах блокировать поток пользовательского интерфейса, ожидающий выполнения задачи сохранения? При вызове onStartInstureState из-за прерывания процесса приложение больше не отображается на переднем плане, поэтому нет интерфейса, который мог бы не отвечать.

Но onStartInstireState также вызывается при удалении экземпляра Activity обновлением конфигурации, которое происходит при изменении ориентации экрана. Очень жаль, когда поворот экрана в сторону ничего не делает в течение нескольких секунд. В этом случае процесс (и, следовательно, пространство памяти) все еще вокруг, поэтому мне не нужно строго гарантировать, что документ попадает в базу данных, если я могу просто сохранить ссылку на него в Bundle вместо его id. но я не знаю, пути сказать разницу между этими двумя случаями.

Существует ли общепринятая практика для таких ситуаций? Мне просто заблокировать нить, чтобы быть в безопасности? Можно ли просто использовать обычные примитивы потока Java для блокировки и ожидания? Есть ли что-то, что я могу сделать, что не блокирует поток, но гарантирует, что постоянная задача будет завершена до того, как Android закроет процесс?

Все это также относится к onPause , так как onStartInstureState не обязательно будет вызван.

8
задан Ben 19 September 2011 в 05:21
поделиться