gpt4 book ai didi

java - 类似谷歌的动态搜索

转载 作者:太空狗 更新时间:2023-10-29 14:27:29 24 4
gpt4 key购买 nike

我想实现类似 google 的自动建议功能。最好的方法是什么?是否有任何已经实现的组件可以提供帮助?

我真的很烦应该多久发送一次请求。我的猜测是应该在一段时间后发送请求。因此,例如,当用户输入一个新角色时,必须触发某种计时器,到最后,它将触发一个函数,比较计时器开始和结束时的输入。根据比较判断是否发送。我应该为此使用线程吗?这不会是资源密集型执行吗?

还有一个选项:创建 while(true) 线程,它获取文本、发送请求并更新主线程结果 View 。不过,我不确定它在 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);
}
}

最佳答案

事件驱动编程与“常用”搜索短语的 n 叉树相结合,是解决此问题的一种方法。

关于java - 类似谷歌的动态搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10655231/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com