Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:AsyncTask未按预期工作_Android_Android Asynctask_Autocompletetextview - Fatal编程技术网

Android:AsyncTask未按预期工作

Android:AsyncTask未按预期工作,android,android-asynctask,autocompletetextview,Android,Android Asynctask,Autocompletetextview,我有一个应用程序,其中有一个AutoCompleteTextView。在每次文本更改事件中,应用程序都会转到web上,从internet检索一些内容,并填充TextView的下拉列表。我使用AsyncTask来读取web内容。但是,如果在接收和填充内容之前键入新文本,则应用程序将挂起,直到提取旧内容为止。有办法解决这个问题吗 我的任务如下: private class GetSuggestions extends AsyncTask<String, Void, String> {

我有一个应用程序,其中有一个AutoCompleteTextView。在每次文本更改事件中,应用程序都会转到web上,从internet检索一些内容,并填充TextView的下拉列表。我使用AsyncTask来读取web内容。但是,如果在接收和填充内容之前键入新文本,则应用程序将挂起,直到提取旧内容为止。有办法解决这个问题吗

我的任务如下:

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
检查该列表,看看是否还有下一步。