2011-09-03 71 views
0

我一直試圖理解並解決過去三天的這個問題。 我有多個ListActivities其中每個查詢相同的數據庫。在每個活動中,我分別關閉並重新打開onPause()和onResume()中的數據庫連接。我填充使用遊標該名單適配器我也關閉並重新打開:Android數據庫光標壽命

@Override 
public void onPause(){ 
    super.onPause(); 

    if(currentCursor != null){ 
     currentCursor.close(); 
     currentCursor = null; 
    } 

    if(mDbHelper != null){ 
     mDbHelper.close(); 
     mDbHelper = null; 
    } 
} 

@Override 
public void onResume(){ 
    super.onResume(); 
    if(mDbHelper == null){ 
     mDbHelper = new DbHelper(this); 
     mDbHelper.open(); 
    } 

    if(currentCursor == null){ 
     new LoadNewListTask().execute(); 
    } 
} 


private class LoadNewListTask extends AsyncTask<String, Void, String> { 
    ProgressDialog dialog; 

    @Override 
    protected void onPreExecute() { 
     dialog = new ProgressDialog(context); 
     dialog.setMessage("Loading..."); 
     dialog.show(); 
    } 
    @Override 
    protected String doInBackground(String... arg0) { 
     try{ 
      currentCursor = mDbHelper.fetchNewRows(); 
     }catch(Exception e){} 
     return null; 
    } 
    @Override 
    protected void onPostExecute(String arg){ 
     if(dialog != null && dialog.isShowing()){ 
      dialog.dismiss(); 
     } 
     if(currentCursor != null && currentCursor.getCount()>0){ 
      String[] from = new String[]{DbHelper.KEY_ID, sortingColumn}; 
      int[] to = new int[]{R.id.ai_about_author_btn, R.id.ai_author_name}; 

      MyAlphabetizedAdapter notes = new MyAlphabetizedAdapter(this, R.layout.author_index_item, currentCursor, from, to, sortingColumn); 
      setListAdapter(notes); 
     } 
    } 
} 

在它的工作好第一眼但是當我動作快活動之間有時我會招人煩光標例外一個這樣說:

05-01 14:45:05.849: ERROR/AndroidRuntime(1145): 
java.lang.IllegalStateException: attempt to acquire a reference on a 
close SQLiteClosable 
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):  at 
android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:31) 
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):  at 
android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:56) 
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):  at 
android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49) 
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):  at 
android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49) 
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):  at 
android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1118) 
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):  at 
android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1092) 
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):  at 
apt.tutorial.Restaurant.getAll(Restaurant.java:14) 

和另一個說這(這種情況發生了很多2.1的設備):

09-03 11:30:19.713: INFO/dalvikvm(2541): Uncaught exception thrown by finalizer (will be discarded): 
09-03 11:30:19.713: INFO/dalvikvm(2541): Ljava/lang/IllegalStateException;: Finalizing cursor [email protected] on null that has not been deactivated or closed 
09-03 11:30:19.713: INFO/dalvikvm(2541):  at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596) 
09-03 11:30:19.713: INFO/dalvikvm(2541):  at dalvik.system.NativeStart.run(Native Method) 

更重要的是我ListActivities的一個實現AlphabetIndexer在那裏我有傳光標。離開活動並使用後退按鈕返回後會發生非常奇怪的事情。該列表已填充(如預期),但是當我嘗試使用快速滾動時,我在遊標上得到了一個空異常,甚至認爲我重新創建了它並重新填充了onResume()列表。

對我來說,它看起來像操作系統不能正確處理多個遊標,或者我可能會錯過這裏的東西?

感謝您的幫助。

回答

2

一般來說,我遇到了試圖讓多個遊標保持活動狀態的問題。特別是當試圖使用託管的光標,我現在試圖儘可能避免(加上他們已棄用)。現在,我試圖做的是打開遊標,用我需要的數據填充對象數組,關閉遊標,然後使用ArrayAdapter填充ListView。如果您需要保持遊標處於活動狀態,並且只需要堆棧中的其他活動正在更改數據,請使用遊標管理器,或者更好的是使用新的CursorLoader。執行此操作時,請勿關閉遊標,因爲您的活動將爲您管理遊標的生命週期。

+0

我在我的其他項目中使用ArrayAdpters和自定義對象,一切正常。使用遊標需要的資源較少,但是我知道它會讓所有人都感到沮喪。 – Marqs

+0

是的 - 我一直在那裏(很明顯,但我仍然沒有答案的問題之一)。我有一個活動,我試圖同時管理3或4個遊標。最後的工作是使用ArrayAdapter方法,除了需要保存的1個遊標外(數據會改變)。 – SBerg413

+0

我不認爲使用數組而不是光標從內存的角度來看是個好主意 – Raffaele

2

由於您啓動了一個異步任務並且您快速離開活動,意味着當任務返回時您將離開此活動,因此onPause()已被調用且遊標未關閉。您可以嘗試取消onPause()中的異步任務。

+0

你有一個好點,但我等待AsyncTask f完成,然後我轉向下一個活動。 – Marqs

+0

嗯,你檢查fetchNewRows()是否返回空嗎? –

+0

是的,我做了,它返回數據。當我不關閉遊標onPause()時,一切都按預期工作,但我們應該不是? SimpleCursorAdapter是否照顧遊標的生命週期? – Marqs