2016-01-29 6 views
1

Я создаю приложение, которое использует SQLiteOpenHelper, и я вижу, что объекты курсора, которые я получил от запросов, закрываются в своих методах finalize.android: зачем закрывать курсоры SQLite db, хотя они будут закрываться по методам их финализации?

Я знаю, что не рекомендуется полагаться на метод finalize, но если я работаю правильно и не оставляю ненужных ссылок на какой-либо объект (в одиночных играх, списках, асинхронных задачах и т. Д.), Я не могу быть уверен, что все мои объекты курсора будут освобождены (после уничтожения активности или фрагмента)?

ответ

3

Я знаю, что это не рекомендуется полагаться на метод финализации

Хорошо, потому что это именно почему он закрывается до пункта финализации.

В отношении Effective Java: «Никогда не зависеть от финализатора, чтобы обновлять критическое постоянное состояние», потому что «один недостаток финализаторов заключается в том, что нет гарантии, что они будут выполнены оперативно».

С момента закрытия соединения меняется постоянное состояние (относительно БД), вы должны закрываться перед финализатором.

Кроме того, объекты курсора не «освобождаются» автоматически. Сама база данных «кэшируется», поэтому независимо от того, выпущен ли сам объект, не изменяется состояние базы данных. За более подробной информацией обращайтесь к this question.

+1

Не только гарантия не будет завершена, но гарантия не будет выполнена. При выключении JVM не выполняет финализатор неподвижных объектов. – Kazaag

+0

Jared, можете ли вы объяснить, как «закрытие соединения меняет постоянное состояние (относительно БД)»? Какое постоянное состояние изменяется, закрывая курсор? – LarsH

+0

@Kazaag: Правда, но если ваш процесс закрывается, это имеет значение, если некоторые курсоры не закрываются? Не то, что я знаю, но могут быть важные вещи, о которых я не знаю, поэтому я хотел бы узнать. – LarsH