2011-05-26 7 views
9

He estado intentando ejecutar mi aplicación en StrictMode para comprobar si hay algún problema oculto que pueda haberse infiltrado. Un problema con el que me encontré es lo que parece ser un falso positivo de Leaked DatabaseConections al usar ContentResolver.Android StrictMode que informa falsos positivos

Después de algunos experimentos tiene el problema simplificado para los siguientes 2 líneas de código:

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

c.close() 

Las 2 líneas por encima de generar los siguientes StrictMode violación:

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) 

Estoy asumiendo que esto es algo específico del hecho de que el Cursor fue devuelto por un contentProvider (por lo que no es un cursor SQLite directo).

¿Alguien tiene alguna idea si esto es de hecho un falso positivo o realmente hay un cursor con fugas.

+2

Estoy viendo algo similar usando la API de CursorLoader lanzada con Honeycomb. Tengo un CursorLoader (que realiza la consulta en una cadena de fondo) y un SimpleCursorAdapter. En principio, SimpleCursorAdapter debería cerrar cualquier cursor existente cuando cambie uno nuevo desde CursorLoader. Sin embargo, sigo viendo estas violaciones al terminador de cursores de StrictMode también, así que es un poco desconcertante. – tomtheguvnor

Respuesta

1

Creo que puedo explicar dónde está el problema. Cuando consulta una base de datos, puede recibir una excepción. Por lo tanto, se creará un Cursor c.close() no se llamará porque hay una excepción. Por lo tanto, debes poner la creación del Cursor en el bloque try catch y cerrar el curson en el bloque finally.

Cuestiones relacionadas