Android StrictMode сообщает о ложных срабатываниях - PullRequest
9 голосов
/ 26 мая 2011

Я пытался запустить свое приложение в StrictMode, чтобы проверить наличие скрытых проблем, которые могли проникнуть. Одна проблема, с которой я столкнулся, - это то, что при использовании ContentResolver кажется ложным положительным результатом Leaked DatabaseConections.

После некоторых экспериментов проблема была упрощена до следующих двух строк кода:

Cursor c = context.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, cols, null, null, MediaStore.Video.Media.DEFAULT_SORT_ORDER);

c.close()

2 строки выше генерируют следующее нарушение StrictMode:

ERROR/StrictMode(26219): Releasing cursor in a finalizer. Please ensure that you explicitly call close() on your cursor: 

ERROR/StrictMode(26219): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

ERROR/StrictMode(26219):
        at android.database.CursorWindow.<init>(CursorWindow.java:62)
        at android.content.ContentProviderProxy.query(ContentProviderNative.java:403)
        at android.content.ContentResolver.query(ContentResolver.java:302)

Я предполагаю, что это что-то специфическое для факта, что Cursor был возвращен contentProvider (так что это не прямой курсор SQLite).

Есть ли у кого-нибудь понимание, действительно ли это ложный положительный результат или действительно дырявый курсор.

1 Ответ

1 голос
/ 22 декабря 2011

Я думаю, что могу объяснить, где проблема.Когда вы запрашиваете базу данных, вы можете получить исключение.Таким образом, будет создан курсор c.close () не будет вызываться, потому что есть исключение.Таким образом, вы должны поместить создание курсора в блок try catch и закрыть курсор в блоке finally.

...