3

入力時に自動的に検索する検索バーを実装しようとしています。

私の考えはAsyncTask、サーバーから検索データをフェッチする を使用することですが、それを使用するとどのように動作するか正確にはわかりませんAsyncTask

私が持っているとしましょうSearchAsyncTask

テキストフィールドが編集されるたびに、私は呼び出します

new SearchAsyncTask().execute(params);

ここで私の質問があります。これはどのような動作になりますか? すべてが返されて呼び出される多くの異なるスレッドを開始しますonPostExecute()か? または、最初に呼び出されたタスクは、まだ動作中に別のインスタンスが呼び出された場合、タスクの途中で停止しますか? それとも全く違うもの?

こう書いたらどうですか?

SearchAsyncTask a = new SearchAsyncTask().execute(params);
...
a.execute(params2);
a.execute(params3);
...
4

2 に答える 2

5

アプリの検索機能も同じ方法で実装しました。TextWatcherユーザーが入力したときに検索結果を作成するために a を使用します。これを達成するために、AsyncTask の参照を保持しています。私の AsyncTask 宣言:

SearchTask mySearchTask = null;  // declared at the base level of my activity

次に、TextWatcher各文字入力で、次のことを行います。

// s.toString() is the user input
if (s != null && !s.toString().equals("")) {

    // User has input some characters

    // check if the AsyncTask has not been initialised yet
    if (mySearchTask == null) {

        mySearchTask = new SearchTask(s.toString());

    } else {

        // AsyncTask is either running or has already finished, try cancel in any case
        mySearchTask.cancel(true);

        // prepare a new AsyncTask with the updated input            
        mySearchTask = new SearchTask(s.toString());

    }

    // execute the AsyncTask                
    mySearchTask.execute();

} else {

    // User has deleted the search string // Search box has the empty string "" now

    if (mySearchTask != null) {

        // cancel AsyncTask 
        mySearchTask.cancel(true);

    }

    // Clean up        

    // Clear the results list
    sResultsList.clear();

    // update the UI        
    sResultAdapter.notifyDataSetChanged();

}
于 2013-07-25T17:04:33.400 に答える
0

2 番目の質問については、このサイト (たとえば、こちら) で答えを見つけることができたと思います。基本的に、AsyncTask の 1 つのインスタンスは 1 回しか実行できません。同じインスタンスを 2 回実行しようとすると、エラーが発生します。

edit : 毎回 a を宣言するnew SearchAsyncTask()と、多数の応答が返されonPostExecute()、 が呼び出されますが、必ずしも正しい順序であるとは限りません。AsyncTaskを変数に格納し.cancel()、新しいメソッドを開始する前にメソッドを使用するのが最善です。

于 2013-07-25T16:41:56.220 に答える