2012-05-18 37 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