2012-05-18 38 views
3

我想實現類似谷歌的自動建議功能。做到這一點的最佳方法是什麼?有沒有已經實施的組件可以提供幫助?類似谷歌的動態搜索

我真的很困擾請求發送的頻率。我的猜測是,經過一段時間後應該發送一個請求。因此,例如,當用戶在新字符中打字時,某種計時器必須被觸發,最後,觸發一個函數來比較從計時器開始到結束的輸入。根據比較結果作出是否發送的決定。我應該使用線程。它不是一個資源密集型執行嗎?

另一個選項:make a while(true)獲取文本的線程發送請求並更新主線程結果視圖。雖然,我不確定它是如何完成Android的。

感謝您的任何建議。

UPD:我想出了一個簡單的使用AsyncTasks的解決方案。每次新建SearchInBackgroundTask啓動時,它會設置一個標誌,阻止其他任何SearchInBackgroundTask實例啓動,除非原始實例完成它的工作。設置標誌後,如果允許執行另一個SearchInBackgroundTask執行,則最後一個輸入字符串將在條件不成立且不等於先前處理的條件下進行處理。

因此,建議任何想法 - 這是一個很好的解決方案嗎?

public class AsyncTaskForSearchActivity extends Activity { 

    protected boolean _threadIsWorking = false; 
    protected String _searchResult; 
    protected String _searchString; 
    protected String _processedSearchString; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     TextView searchbox = (TextView) findViewById(R.id.searchbox); 
     searchbox.addTextChangedListener(_searchboxWatcher); 
    } 

    protected TextWatcher _searchboxWatcher = new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) {} 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

     @Override 
     public void afterTextChanged(Editable s) { 
      _searchString = s.toString(); 
      if(_threadIsWorking == false){ 
       _performSearchTask(); 
      } 
     } 
    }; 

    protected Handler _onRetrieveResult = new Handler(){ 
     public void dispatchMessage(android.os.Message msg) { 
      if(_threadIsWorking == false && _searchString.length() > 0 && _processedSearchString != _searchString){ // what's the difference bet equeals and == 
       _performSearchTask(); 
      } 
     }; 
    }; 

    protected class SearchInBackgroundTask extends AsyncTask<String, Void, Void>{ 
     protected String _s; 

     @Override 
     protected Void doInBackground(String... params) { 
      _s = params[0]; 
      try { 
       // httpProvider -> retrieve 
       Thread.sleep(6000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      _searchResult = "xxx"; 
      _threadIsWorking = false; 
      _onRetrieveResult.sendEmptyMessage(0); 
     } 
    } 

    protected void _performSearchTask(){ 
     _threadIsWorking = true; 
     _processedSearchString = _searchString; 
     Toast.makeText(AsyncTaskForSearchActivity.this, _processedSearchString, 1).show(); 
     (new SearchInBackgroundTask()).execute(_processedSearchString); 
    } 
} 

回答

1

事件驅動的編程,加上「常見」搜索短語的n元樹,是解決這個問題的一種方法。

+0

嗯,我不會在我的應用程序內存儲任何值。我需要做的就是發送請求到服務器。我需要組成一個計時器,並可能使用一些現有的組件。 – user1384991