Ответ 1
Если вы не закрываете соединения с базой данных, они будут вызывать утечку памяти с течением времени.
В примере Notepad используется startManagingCursor
, но вам все равно нужно явно закрыть соединение db. Запустите пример "Блокнот" как есть и отредактируйте несколько заметок подряд, вы увидите, что он начинает бросать предупреждения и ошибки в LogCat. (В более крупных приложениях вы также увидите предупреждения об утечке памяти.)
W/SQLiteCompiledSql( 302): Releasing statement in a finalizer. Please ensure that you explicitly call close() on your cursor: INSERT INTO notes(body, title) VALUES(?, ?);
W/SQLiteCompiledSql( 302): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
W/SQLiteCompiledSql( 302): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:62)
...
W/SQLiteCompiledSql( 302): at dalvik.system.NativeStart.main(Native Method)
E/Database( 302): close() was never explicitly called on database '/data/data/com.android.demo.notepad3/databases/data'
E/Database( 302): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
E/Database( 302): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1810)
...
E/Database( 302): at dalvik.system.NativeStart.main(Native Method)
Вы упомянули, что закрытие его в onDestroy()
"оставляет уязвимости" в любых потоках, отличных от UI, которые все еще работают. Если вы используете AsyncTask, вы можете проверить статус этих потоков, используя getStatus
для своих задач.
if ( myAsyncTask.getStatus() == AsyncTask.Status.FINISHED ){
mDbHelper.close();
}
Затем закройте соединение в методе onPostExecute
вашего AsyncTask
.
Надеюсь, что это поможет...