Android:AsyncTask未按预期工作
我有一个应用程序,其中有一个AutoCompleteTextView。在每次文本更改事件中,应用程序都会转到web上,从internet检索一些内容,并填充TextView的下拉列表。我使用AsyncTask来读取web内容。但是,如果在接收和填充内容之前键入新文本,则应用程序将挂起,直到提取旧内容为止。有办法解决这个问题吗 我的任务如下:Android:AsyncTask未按预期工作,android,android-asynctask,autocompletetextview,Android,Android Asynctask,Autocompletetextview,我有一个应用程序,其中有一个AutoCompleteTextView。在每次文本更改事件中,应用程序都会转到web上,从internet检索一些内容,并填充TextView的下拉列表。我使用AsyncTask来读取web内容。但是,如果在接收和填充内容之前键入新文本,则应用程序将挂起,直到提取旧内容为止。有办法解决这个问题吗 我的任务如下: private class GetSuggestions extends AsyncTask<String, Void, String> {
private class GetSuggestions extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
System.out.println("Suggestions Called()");
doSearch(params[0]); // reads the web and populates the suggestions ArrayList
return null;
}
@Override
protected void onPostExecute(String result) {
System.out.println("Adapter Called() " + suggestions.size());
suggestionAdapter = new ArrayAdapter<String>(
getApplicationContext(), R.layout.list, suggestions);
searchText.setAdapter(suggestionAdapter);
}
}
私有类GetTask{
@凌驾
受保护的字符串doInBackground(字符串…参数){
System.out.println(“名为()的建议”);
doSearch(params[0]);//读取web并填充建议ArrayList
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果){
System.out.println(“适配器调用()”+建议.size());
SuggestionaAdapter=新阵列适配器(
getApplicationContext(),R.layout.list,建议);
searchText.setAdapter(suggestionAdapter);
}
}
谢谢!
Rahul.您可以检查AsyncTask是否正在运行
public boolean isRunning()
{
if (_querymysqltask == null) return false;
if (_querymysqltask.getStatus() == AsyncTask.Status.FINISHED) return false;
else return true;
}
您可以取消任务以重新启动新的搜索,也可以等待任务结束
if(task == null)
{
task = new GetSuggestions();
task.execute(new String[] {word});
}
else
{
task.cancel(true);
task = new GetSuggestions();
task.execute(new String[] {word});
}
您可以取消该任务并使用新输入的文本启动一个新任务。代码将与上面的内容类似。您可以显示progressDialog,直到从web获取数据
private ProgressDialog dialog = new ProgressDialog(HomeActivity.this);
/** progress dialog to show user that the backup is processing. */
/** application context. */
protected void onPreExecute() {
this.dialog.setMessage("Please wait");
this.dialog.show();
}
@Override
protected void onPostExecute(final Boolean success) {
if (dialog.isShowing()) {
dialog.dismiss();
}
}
如果用户输入新文本,您可能希望取消AsyncTask。在下面的dos中描述了取消异步任务
问题似乎出在
doSearch(params[0]); // reads the web and populates the suggestions ArrayList
doSearch()是从
doInBackground()
调用的,因此它不应该触及UI元素。只是,从doInBackground()
执行“读取web”部分,并从onPostExecute()
填充ArrayList。在您的情况下,这取决于您试图完成的任务。我想说,如果下拉列表中的内容与TextView
的内容直接相关,并且始终是那一个TextView
,那么停止该过程并用新的重新启动它。如果没有,那么您可以创建一个等待列表,并让onPostExecute
检查该列表,看看是否还有下一步。