Я обычно в небольших приложениях объявляю SharedPreferences статическим, и SQLiteDatabase статическим, может ли это стать причиной утечки памяти? Или мне лучше в каждом нужном классе/фрагменте объявлять SharedPreferences или SQLiteDatabase, проделывать нужные операции и закрывать их с выходом?
Ответ
Само объявление статичным экземпляры класса менеджера БД, или Shared, наоборот скорей всего избавит от лишних утечек, ну это если рассуждая что такое static. В целом дальше зависит от использования. Ликнуть Shared я даже не представляю как это возможно при static, а вот с БД действительно можно такое устроить причем как при записи, так и при чтении. Ну вот например если вы будете ставить курсор и не закрывать его, и то в это случае вы получите что-то типо Object Sqlite.* was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed. Поэтому даже рассуждая так, можно сказать как в документации SQLite will never leak memory. This is true even in the face of memory allocation failures or other system errors. Вкратце в Sqlite нет мемори ликов, если вы даже сами накосячите. Но иногда можно встретить, такое
Leak found
Caused by: java.lang.IllegalStateException: SQLiteDatabase created and never closed
Существует много подходов, как использовать БД Sqlite, но есть пару докладов, в которых рассказывается, что самый лучший способ для ANdroid это открыть при запуске (в Application классе) и закрывать при выходе. Иначе как бы вы не использовали коннекты к БД с разных конекстов, то ловите database is locked, синглтоном но можете словить attempt to re-open an already-closed object: SQLiteDatabase поэтому я бы советовал не заниматься преждевременной оптимизацией БД, особенно в маленьких приложениях. Сам static ужасен для структуры проекта, в любом случае лучше не использовать его.
Комментариев нет:
Отправить комментарий