2011-11-01 43 views
1

背景:我有一個外語字典應用程序,運行良好,並有幾千安裝。但是,我對代碼不滿意,而且我試圖解決一些性能問題。代碼審查請求:Android使用SQLite光標

我越看越這段代碼,越是確信我沒有正確使用Android下的SQLite遊標。

這個概念是,當一個人鍵入英文或目標語言的字母時,光標從SQLite返回一個單詞,定義等列表。其中添加到列表適配器,它驅動列表視圖。但是,我一直在問自己,爲什麼我要遍歷遊標並用幾百個項目填充一個列表適配器,而在幾秒鐘內又會輸入另一個字符,並且整個列表都會發生變化。

我已經閱讀了startManagingCursor,但沒有看到它如何解決我的問題,並且在API 13下注意到現在有了整個CursorLoader概念。但是,我有一個真正的心理障礙。如果我沒有提前將行添加到適配器,我不明白如何在滾動期間填充ListView。

儘管我不想發佈整個應用程序,但我已經在此發佈了一個小代碼片段,並要求進行代碼審查,以幫助我瞭解自己做錯了什麼。

public class Dictionary extends Activity { 
.... 
KeyAdapter   keyadapter = new KeyAdapter(); 
List<KoshRow>  koshRows; 

KoshRowListAdapter laKoshRow = new KoshRowListAdapter(this, koshRows); 
vListView.setAdapter(laKoshRow); 
.... 
lots of stuff happens, and eventually in responding to a key press 
... 
Cursor c = null; 
if (keyadapter.isEnglish) 
c = db.lookupEnglish(ActualEntry, "%", ranges); 
else 
c = db.lookupPunjabi(ActualEntry, "*", ranges); 
koshRows.clear(); 
if (c != null && c.moveToFirst()) { 
do { 
    if (keyadapter.isEnglish) 
    koshRows.add(new KoshRow(c.getInt(0), -1, c.getString(1), c.getString(2))); 
    else 
    koshRows.add(new KoshRow(-1, c.getInt(0), c.getString(2), c.getString(1))); 
} while (koshRows.size() < MAX_ROWS && c.moveToNext()); 
c.close(); 
... 
laKoshRow.notifyDataSetChanged(); 
vListView.setSelection(0); 

回答

1

我會建議從UI線程中刪除所有遊標創建的東西,並使用CursorAdapter。使用CursorAdapter你將避免該項目添加循環。

0

就我個人而言,我將搜索設置爲使用500ms處理程序延遲調用搜索功能。每次用戶更改搜索查詢時都會調用定時處理程序。每次創建處理程序時,先前的處理程序都會被銷燬,因此除非用戶停止鍵入500毫秒,否則不會執行搜索。