2011-12-21 2 views
1

ネットで多くを検索しましたが、質問に対する回答が見つかりませんでした。java.lang.IllegalStateExceptionを取得する:既に閉じられているオブジェクトを再オープンしようとしました:アンドロイドでカーソルを使用しているとき

私はDBからデータを取得するためにCursorを使用しています(マップ上のオーバーレイマーカーに関する情報) 私はこのデータの助けを借りてマップをロードしています。 カーソルによるDBとの相互作用は、asyncTaskで実行されます。カーソルがマップをロードするために実行している間、私は戻るボタンを押すと

は今ここに私が

を直面しています問題である(つまり、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

に使用していたコードのスナップショットです私がそのクラッシュをトレースすることができごとに10 DoInBackground法下

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

    cursor.moveToNext(); 
} 

cursor.close(); 
onPostExecute法で

.... 

closeKewDataBase(); 

"cursor.moveToNext();"

誰もが手動でcursor.close()でカーソルをクローズしているとして、あなたはstartManagingCursor(cursor)を呼び出すべきではありません。この

答えて

1

を固定助けることができます。あなたはどちらかを選ぶ必要があります。

あなたはAsyncTaskでこれをやっているとAsyncTaskActivityより長生きできるよう、あなたはほぼ確実に、あなたのためのカーソルを管理するために囲むActivityを望んでいません。それで、手動でやってください。

(私はAsyncTaskあなたActivityの内部クラスであると推定。)

+0

解決される問題...あなたのグラハム・ボーランド – Nik

+0

こんにちはグラハムありがとう、私は同じ問題に直面しています..あなたは([私のポスト]をチェックすることができます。http ://stackoverflow.com/questions/11633581/attempt-to-re-open-an-already-closed-object-java-lang-illegalstateexception/11633761#comment15427898_11633761)してください。 – GoCrazy

関連する問題