我想实现类似谷歌的自动推荐功能。什么是最好的方法,是否已经实施了任何可以提供帮助的组件?
我真的很烦恼应该发送请求的频率。我的猜测是一段时间后应该发送一个请求。因此,例如当用户在新角色中工作时,必须触发某种计时器,最后,它将触发一个函数,比较来自计时器开始和结束的输入。判断比较是否决定是否发送。我应该使用线程。它不会是一个资源密集型的执行吗?
还有一个选项:make a while(true)Thread,它获取文本,发送请求并更新主线程结果视图。虽然,我不确定它是如何在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);
}
}
答案 0 :(得分:1)
事件驱动的编程,加上一个“常见”搜索短语的n-ary树,是解决这个问题的一种方法。