0

AutoCompleteTextView があるアプリがあります。すべてのテキスト変更イベントで、アプリは Web にアクセスしてインターネットからコンテンツを取得し、TextView のドロップダウンに入力します。Web コンテンツの読み取りを行うために 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
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

データがWebからフェッチされるまで、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 が実行されているかどうかを確認できます。

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

ユーザーが新しいテキストを入力した場合は、おそらく AsyncTask をキャンセルする必要があります。AsyncTask のキャンセルについては、次の dos で説明されています。

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 要素に触れることは想定されていません。 から「Web を読む」部分を実行し、 からdoInBackground()ArrayList を設定しonPostExecute()ます。

于 2012-07-31T05:39:21.993 に答える