2011-02-05 16 views
6

Tengo una ListActivity que está enlazado a un cursor, cuando los elementos de la ListView se seleccionan una actividad EditItem es lanzado por startActivityForResult, esta EditItem preformas de actividad varias consultas, colocadas cada una en su propio cursor separadas. Estos se utilizan para poblar spinners, al igual que un campo de búsqueda en un Access DB.Prevenir IllegalStateException en SQLiteCursor para Android

Mi problema es que una vez que el usuario sale de esta actividad EditItem, ya sea a través de enviar, cancelar o botón de retroceso, se remonta a la ListView Actividad y selecciona otra entrada en el ListView (mismo artículo o una diferente) consigo IllegalStateException errores en mi clase SQLiteCursor (de Android, no mía). I am cerrando mis cursores en el método onDestroy de actividades ambas, ya que a veces pedir un resultado seguirá destruyendo la actividad de llamada.

Esto no siempre ocurre en la segunda selección de un artículo, a veces ocurrirá en la tercera selección. Pensé que tal vez solo me estaba moviendo más rápido que el sistema operativo, así que comencé a pausar, hasta 30 segundos, entre mis acciones, el error solo se produce después de llamar a la actividad para obtener el resultado una segunda o tercera vez. Ninguna cantidad de pausa soluciona esto.

Editar: El error está en el método SQLiteCursor finalize en la llamada a super.finalize();

editar # 2: Seguimiento de la pila para el hilo:

Daemon System Thread [<5> HeapWorker] (Suspended (exception IllegalStateException)) 
SQLiteCursor.finalize() line: 603 
NativeStart.run() line: not available [native method] 

editar # 3 Seguimiento de la pila de LogCat (lista de piezas es el nombre de la tabla):

INFO/dalvikvm(599): Ljava/lang/IllegalStateException;: Finalizing cursor [email protected] on partslist that has not been deactivated or closed 
INFO/dalvikvm(599):  at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596) 
INFO/dalvikvm(599):  at dalvik.system.NativeStart.run(Native Method) 
+1

@Timbermar: El único lugar 'SQLiteCursor' arroja' IllegalStateException' no tiene nada que ver con 'finalize()', basado en el código fuente, por lo que es difícil darle consejos. Usa 'StrictMode' en un entorno Android 2.3 para ayudarte a depurar esto. En el futuro, considere incluir la parte relevante del seguimiento de pila en sus preguntas. – CommonsWare

+0

@CommonsWare: Solo lo mencioné para indicar que no era un problema ejecutar las consultas, parece ser causado por mis cursores no se eliminan correctamente. Además, olvidé mencionar que uso 'startManagingCursor' también, cuando creo los cursores. Además, agregué la pila, las 3 líneas de la misma. Este error no está ocurriendo en el hilo principal, sino en un hilo separado para que la aplicación continúe ejecutándose incluso cuando esto se cuelga. – Timbermar

+1

@Timbermar: Eso no es un rastro de pila. Ése es Eclipse que le dice que interceptó una excepción. Deje que el procesamiento continúe y obtendrá un seguimiento de pila en el panel LogCat de la perspectiva DDMS. – CommonsWare

Respuesta

1

Agregar la falta cursor.close() fue la solución al problema.

16

Asegúrese de cursor.close() cuando haya terminado con ellos.

+0

Esta fue la respuesta para mí. –

+0

y yo. ¿Por qué esta respuesta no es aceptada? ¡Maldita sea! – Daniel

+0

@Daniel - Porque CommonsWare respondió esto en febrero y se merece el Rep., No Matt (sin ofender a Matt) – Timbermar

Cuestiones relacionadas