android - 获取 java.lang.IllegalStateException : attempt to re-open an already-closed object: when using cursor in Android

标签 android sqlite cursor android-asynctask

我正在使用 Cursor 从数据库中获取数据(这是关于 map 上的叠加标记的信息)。我正在借助这些数据加载 map 。通过 Cursor 与数据库的交互是在 asyncTask 中完成的。

现在这是我面临的问题。如果我在光标运行加载 map 时按下后退按钮(即在 while 循环中加载覆盖标记的中间),我会收到此错误:

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): 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

这是我在 asyncTask 中使用的代码的快照

在DoInBackground方法下

openKewDataBase();
Cursor cursor = getCursorForOverLayIcons();
startManagingCursor(cursor);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
            ...

    cursor.moveToNext();
}

cursor.close();

在onPostExecute方法下

....

closeKewDataBase();

据我所知,它的崩溃发生在“cursor.moveToNext();”

最佳答案

当您使用 cursor.close() 手动关闭游标时,您不应调用 startManagingCursor(cursor)。您需要选择其中之一。

当您在 AsyncTask 中执行此操作时,您几乎肯定不希望封闭的 Activity 为您管理光标,因为 AsyncTask 可以比 Activity 长寿。所以只需手动执行即可。

(我假设 AsyncTask 是您的 Activity 的内部类。)

关于android - 获取 java.lang.IllegalStateException : attempt to re-open an already-closed object: when using cursor in Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8589346/

相关文章:

java - Android SQLite,onCreate() 未被调用

android - Flutter 与现有应用程序崩溃

ios - IOS 数据连接上的 Sqlite

cursor - R 工作室 : Change cursor color

java - 如何更改 JTextArea 的默认光标位置?

android - GCMRegistrar 无法解析

android - 如何制作带有导航按钮的Python Kivy webview应用程序并在浏览器中打开外部链接?

bash - SQLite插入的bash循环错误

android - 重新安装应用程序时旧数据出现在 SQLite 数据库中

java - 在android中比较两个字符串