2013-10-05 24 views
0

所以我有這個edditbox搜索停止名的data.txt,並使用我的自定義適配器顯示它到列表視圖,所以每次我輸入一個單詞它篩選結果。做一個更好的搜索沒有滯後

我的問題是,它滯後一點,因爲我再次輸入一個詞,因爲我認爲是過濾所有結果。

我的問題是我如何使它不滯後我知道我有沒有辦法在後臺過濾數據?

PS。我data.txt中的數據是一個非常大的集合讓我們說停止名數據

searchEditText2.addTextChangedListener(new TextWatcher(){ 

      @Override 
      public void afterTextChanged(Editable arg0) { 
      } 

      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, 
        int arg2, int arg3) { 
      } 

      @Override 
      public void onTextChanged(CharSequence cs, int arg1, int arg2, 
        int arg3) { 

       customAdapter.getFilter().filter(cs); 

      } 

     }); 

回答

2

100MB的,我建議你先顯示一些特定的單詞,然後可以在滾動顯示下一個搜索結果,甚至在加載更多按鈕點擊顯示更多記錄。一次顯示如此龐大的數據不可能是正確的。考慮到不同的Android設備和處理器的速度,一些設備可能根本不會響應。

1

,因爲你需要在一個巨大的文件進行搜索,並把它全部入堆內存是太危險了(可以得到OOM),你可以做接下來的事情就爲了讓事情更好一點:

  1. 將文件加載到JNI代碼並在那裏進行搜索。確定它需要一些加載時間並佔用內存,並且會讓操作系統更喜歡在進入後臺時終止進程,但速度會更快。

  2. 緩存以前的結果

  3. 壓縮文件,以便更多的工作將是CPU,而不是存儲單元上。

  4. 想一個更好的方法來幫助搜索,根據數據和查詢。因爲我不知道數據或查詢,所以我不能更具體。例如,如果所有文本都是英文的,則可以使用ascii而不是unicode,這樣每個字符將佔用一個字節而不是2個字節。

  5. 如果速度太慢,您甚至可以將它放在遠程服務器上並從設備查詢。在那裏你可以把它全部加載到內存中,並隨時準備好進行查詢。

  6. 您可以使用某種search algorithm來完成您的數據,使其更快地進行搜索。我認爲KMP算法似乎沒問題。有一個很好的實現它here,我認爲(沒有測試它)。有一個視頻描述它是如何工作的here。也許你不必這樣做,因爲內置實現如何搜索字符串已經非常有效,所以只有在嘗試過其他解決方案時才這樣做。

    另外,我認爲正則表達式可以達到同樣的效果。

無論哪個那些你選擇,請記住,它仍然是一個低規格設備相比,一個完全成熟的PC,所以要小心RAM的使用或者你會得到一些設備OOM。

相關問題