Java.lang.IllegalStateException: attempt to re-open eines bereits geschlossenen Objekt: wenn Sie mit dem cursor in Android
Ich bin mit dem Cursor, um Daten aus der DB (es ist Informationen über die overlay-Marker auf der Karte). Ich bin das laden einer map mit Hilfe dieser Daten. Interaktion mit der DB durch Cursor wird in einem asyncTask.
Hier ist nun das problem das ich mich vor. Wenn ich drücken Sie die zurück-Taste, während der cursor ausgeführt wird, um das laden der Karte (D. H. in der Mitte der laden von overlay-Marker in einer while-Schleife) bekomme ich diesen Fehler:
Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT _id, category, latitude, longitude FROM node)
Hier ist die komplette Spur:
12-21 11:11:30.173: E/AndroidRuntime(2824): FATAL EXCEPTION: AsyncTask #5
12-21 11:11:30.173: E/AndroidRuntime(2824): java.lang.RuntimeException: An error occured while executing doInBackground()
12-21 11:11:30.173: E/AndroidRuntime(2824): at android.os.AsyncTask$3.done(AsyncTask.java:200)
12-21 11:11:30.173: E/AndroidRuntime(2824): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
12-21 11:11:30.173: E/AndroidRuntime(2824): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
12-21 11:11:30.173: E/AndroidRuntime(2824): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
12-21 11:11:30.173: E/AndroidRuntime(2824): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-21 11:11:30.173: E/AndroidRuntime(2824): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
12-21 11:11:30.173: E/AndroidRuntime(2824): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
12-21 11:11:30.173: E/AndroidRuntime(2824): at java.lang.Thread.run(Thread.java:1102)
12-21 11:11:30.173: E/AndroidRuntime(2824): Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT _id, category, latitude, longitude FROM node)
12-21 11:11:30.173: E/AndroidRuntime(2824): at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:34)
12-21 11:11:30.173: E/AndroidRuntime(2824): at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:64)
12-21 11:11:30.173: E/AndroidRuntime(2824): at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:299)
12-21 11:11:30.173: E/AndroidRuntime(2824): at android.database.sqlite.SQLiteCursor.onMove(SQLiteCursor.java:271)
12-21 11:11:30.173: E/AndroidRuntime(2824): at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:188)
12-21 11:11:30.173: E/AndroidRuntime(2824): at android.database.AbstractCursor.moveToNext(AbstractCursor.java:256)
12-21 11:11:30.173: E/AndroidRuntime(2824): at org.mid.kew.activities.MapPageActivity$MapLoadingAsyncTask.doInBackground(MapPageActivity.java:632)
12-21 11:11:30.173: E/AndroidRuntime(2824): at org.mid.kew.activities.MapPageActivity$MapLoadingAsyncTask.doInBackground(MapPageActivity.java:1)
12-21 11:11:30.173: E/AndroidRuntime(2824): at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-21 11:11:30.173: E/AndroidRuntime(2824): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-21 11:11:30.173: E/AndroidRuntime(2824): ... 4 more
und hier ist ein Schnappschuss der code, den ich benutze in asyncTask
Unter DoInBackground-Methode
openKewDataBase();
Cursor cursor = getCursorForOverLayIcons();
startManagingCursor(cursor);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
...
cursor.moveToNext();
}
cursor.close();
Unter onPostExecute-Methode
....
closeKewDataBase();
Als pro kann ich Seine Spur Absturz bei "cursor.moveToNext();"
InformationsquelleAutor Nik | 2011-12-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Sie manuell schließen Sie den cursor mit
cursor.close()
ist, sollten Sie nicht rufen SiestartManagingCursor(cursor)
. Sie müssen wählen Sie eine oder das andere.Als Sie tun dies in einer
AsyncTask
Sie fast sicher nicht wollen, dass die umschließendenActivity
zum verwalten der cursor für Sie, wie dieAsyncTask
können, überleben dieActivity
. So tun Sie es einfach manuell.(Ich nehme an, der
AsyncTask
ist eine innere Klasse von IhremActivity
.)Hallo Graham, ich bin mit dem gleichen problem.. könnten Sie überprüfen, mein Beitrag bitte.
InformationsquelleAutor Graham Borland