Доступ к базе данных в отдельном потоке в Android
-
28-09-2019 - |
Вопрос
Как вы можете получить доступ к SQLiteDatabase
база данных в отдельном потоке (т.е. AsyncTask
) из Activity
И убедитесь, что вы всегда оставляете его в юридическом состоянии?
Если я правильно понимаю, поток может быть убит в любой момент, и база данных может оставаться открытой, потенциально давая IllegalStateException
(Sqlitedatabase создан и никогда не закрывается) в последнее время.
Как вы справляетесь с этим?
Решение
Если ваш AsyncTask
управляется вашим Activity
, тогда Activity
может отменить AsyncTask
в правильном времени (когда он становится уязвимым, чтобы быть убитым по ОС, например после Activity.onPause()
) так AsyncTask.onCancelled()
будет называться, где вы можете закрыть БД.
Если ваш AsyncTask
(или а Thread
) не управляется вашим Activity
Тогда вы попадаете в беду и должны рассмотреть вопрос о перепроектировании вашей архитектуры.
Другие советы
Два пути:
Вы можете зарегистрировать
Runtime.addShutdownHook(..)
И закрыть базу данных там.Создать таможние
Application
и внедритьonLowMemory()
где вы закрываете базу данных.