मैं डीबी से डेटा प्राप्त करने के लिए कर्सर का उपयोग कर रहा हूं (यह मानचित्र पर ओवरले मार्करों के बारे में जानकारी है)। मैं इस डेटा की मदद से एक नक्शा लोड कर रहा हूं। कर्सर के माध्यम से डीबी के साथ इंटरेक्शन asyncTask में किया जाता है।

अब मैं जिस समस्या का सामना कर रहा हूं वह यहां है। यदि मैं नक्शा लोड करने के लिए कर्सर चल रहा है, तो मैं बैक बटन दबाता हूं (यानी थोड़ी देर में ओवरले मार्कर लोड करने के बीच में) मुझे यह त्रुटि मिलती है:

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();

के अनुसार मैं "कर्सर.moveToNext ();" पर इसके दुर्घटनाग्रस्त होने का पता लगा सकता हूं।

1
Nik 21 पद 2011, 15:50

1 उत्तर

सबसे बढ़िया उत्तर

चूंकि आप मैन्युअल रूप से cursor.close() के साथ कर्सर बंद कर रहे हैं, आपको startManagingCursor(cursor) को कॉल नहीं करना चाहिए। आपको एक या दूसरे को चुनना होगा।

जैसा कि आप इसे AsyncTask में कर रहे हैं, आप निश्चित रूप से नहीं चाहते कि संलग्न Activity आपके लिए कर्सर को प्रबंधित करे, क्योंकि AsyncTask Activity से आगे निकल सकता है। तो बस इसे मैन्युअल रूप से करें।

(मुझे लगता है कि AsyncTask आपके Activity का आंतरिक वर्ग है।)

1
Graham Borland 21 पद 2011, 15:59
समस्या हल हो गई ... धन्यवाद ग्राहम बोरलैंड
 – 
Nik
21 पद 2011, 16:24
हाय ग्राहम मुझे एक ही समस्या का सामना करना पड़ रहा है .. क्या आप जांच सकते हैं मेरी पोस्ट कृपया।
 – 
vinothp
25 जुलाई 2012, 12:40