2012-03-14 32 views
12

我的活動包含此代碼來獲取SD卡上的所有圖片:無法恢復活動時出現錯誤

String[] projection = {MediaStore.Images.Media._ID, 
         MediaStore.Images.Media.DATA, 
         MediaStore.Images.ImageColumns.DATA}; 
Cursor cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
          projection, null, null, 
          MediaStore.Images.Media._ID); 
int count = cursor.getCount(); 
int image_path_index = cursor.getColumnIndex(MediaStore.Images.Media.DATA); 
int i; 
for(i = 0; i < count; i++) { 
    cursor.moveToPosition(i); 
    String p = cursor.getString(image_path_index); 
    fd.addToPhonePhoto(p); 
} 
cursor.close(); 
而活動是恢復

的發生:

03-14 14:06: 48.380:E/AndroidRuntime(20793):java.lang.RuntimeException:無法恢復活動{}:java.lang.RuntimeException:無法恢復活動{}:android.database.StaleDataException:嘗試訪問遊標之後關閉。

它只發生在Android 4.0上。如果在Android 2.x或3.x上,它可以正常工作。但是,如果我更改了「開發人員選項」中選擇「不保留活動」選項的系統設置。 錯誤不顯示。

我想修改我的代碼以避免此錯誤而不更改系統設置。我應該怎麼做?

回答

41

我想這是因爲managedQuery調用+關閉遊標。從managedQuery()方法的文檔:上的光標使用此方法, 因爲活動會替你在適當的時候獲得的,不要調用close():

警告。 但是,如果您從 管理的查詢中對光標調用stopManagingCursor(光標),則系統將不會自動關閉光標,在這種情況下,您必須調用close()。

將光標留給Android系統管理,不要撥打cursor.close();

Note:managedQuery方法已被棄用和應當避免,實施CursorLoaders代替。有關CursorLoaders的更多信息可在developer.android.com找到。

+0

你的回答是對的。但我的另一項活動也有同樣的錯誤。代碼像這樣http://stackoverflow.com/questions/9426170/why-the-cusor-null。如果沒有調用cursor.close(),則在運行多個循環時,cousor將會得到空值。如何避免它? – brian 2012-03-14 07:03:53

+0

@brian也許你的另一個問題的問題是因爲你做的操作的大小。你可以完全查詢MediaStore.Images.Media'的兩列,然後製作幾百(甚至超過1000)'managedQuery'來獲取縮略圖(同樣,如果你希望縮略圖不應該查詢'MediaStore .Images.Thumbnails' contentprovider?)。另外你說遊標有時候是空的,但是不會在遊標上調用關閉引發'NullPointerException'? – Luksprog 2012-03-14 07:37:19

+0

例如,我有2000張照片。從1到1000的for循環有效,但超過1000會變爲空。如果使用NullPointerException可能導致多張照片未被打開。 – brian 2012-03-14 07:53:56

0

刪除cursor.close();在你的代碼 它做工精細絕對

1

功能,managedQuery()已過時。

請使用getContentResolver()。query()。

參數相同。

相關問題