0

我有一个应用程序,其中有一个 AutoCompleteTextView。在每个文本更改事件中,应用程序都会进入网络以从 Internet 检索一些内容并填充 TextView 的下拉列表。我使用 AsyncTask 来读取网页内容。但是,如果在接收和填充内容之前输入了新文本,则应用程序会挂起,直到获取旧内容为止。有没有办法解决这个问题?

我的 AsyncTask 如下,

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);
    }
}

谢谢!拉胡尔。

4

5 回答 5

0

您可以检查 AsyncTask 是否正在运行。

public boolean isRunning()
{
    if (_querymysqltask == null) return false;
    if (_querymysqltask.getStatus() == AsyncTask.Status.FINISHED) return false;
    else return true;
}

您可以取消任务以使用新搜索重新启动它,或等待它结束。

于 2012-07-31T05:26:28.620 回答
0
if(task == null)
{
    task = new GetSuggestions();
    task.execute(new String[] {word});
}
else
{
    task.cancel(true);
    task = new GetSuggestions();
    task.execute(new String[] {word});
}

您可以取消任务并使用新输入的文本开始新任务。代码将类似于上面的内容。

于 2012-07-31T05:29:59.437 回答
0

您可以显示 progressDialog 直到从网络获取数据。

   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();
        }
    }
于 2012-07-31T05:31:35.073 回答
0

如果用户输入新文本,您可能希望取消 AsyncTask。以下 dos 中描述了取消 AsyncTask。

http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-07-31T05:35:52.433 回答
0

似乎问题出在

doSearch(params[0]);  // reads the web and populates the suggestions ArrayList

doSearch() 已从 调用doInBackground(),因此不应触摸 UI elemnets.only,从 执行“读取网络”部分doInBackground()并从中填充 ArrayList onPostExecute()

于 2012-07-31T05:39:21.993 回答