Android StrictMode сообщает о ложных срабатываниях

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

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

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

c.close()

Две строки выше генерируют следующее нарушение 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).

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


person StefanK    schedule 26.05.2011    source источник
comment
Я вижу нечто подобное, используя CursorLoader API, выпущенный с Honeycomb. У меня есть CursorLoader (который выполняет запрос в фоновом потоке) и SimpleCursorAdapter. В принципе, SimpleCursorAdapter должен закрывать любой существующий курсор, когда я заменяю новый из CursorLoader. Тем не менее, я продолжаю видеть эти нарушения StrictMode финализатора курсора, поэтому это немного сбивает с толку.   -  person tomtheguvnor    schedule 06.10.2011


Ответы (1)


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

person Yury    schedule 22.12.2011