0

autoCompleteTextviewWeb サービスからの提案でを作成したい。テキストの変更時に、入力したテキストで Web サービスを呼び出します。

public String searchpalace_Searchtext(String serchtext)  
{       
    String resultString = "";   
    try {           
        String searchtext = URLEncoder.encode(String.valueOf(serchtext), "UTF-8");              
        HttpClient Clientloc = new DefaultHttpClient();         
        String URL = baseUrl + "places?name=" + searchtext;      
        HttpGet httpget = new HttpGet(URL);
        ResponseHandler<String> responseHandler = new BasicResponseHandler();

        resultString = Clientloc.execute(httpget, responseHandler);             
    }
    catch (Exception e) {
        resultString = "";
    }     

    return resultString;
}

この関数はasyncTask、リーチ文字が入力または削除されたときに呼び出されます。テキストがすばやく入力されると、新しいリクエストが到着したときに保留中のリクエストをキャンセルしたいと思います。前のリクエストをキャンセルするにはどうすればよいですか?

4

3 に答える 3

1

キューに入れられた各タスクを調べて、cancel() メソッドを呼び出すことができます。isCancelled()を使用して、タスクがキャンセルされたかどうかを確認します。テキスト ボックス内の変更ごとに非同期タスクをトリガーしないでください。不必要なオブジェクトの作成を避けるために、わずかな遅延を導入できAsyncTaskます。

于 2013-08-02T12:59:51.347 に答える
0

HttpClient.execute() が中断できる場合は、(true) を渡すと AsyncTask.cancel(true) が中断します。ドキュメントには、中断可能かどうかは記載されていません。実験してください。そうでない場合は、別の回答で提案されているツールキットを調査する必要がある場合があります。とにかく、 isCancelled() をチェックして、結果を適用しないことができます。接続が開始されると、おそらく大きなオーバーヘッドではありません。

Android のバージョンによっては、複数の AsyncTask を並行して実行できる場合 (ドーナツ - ハニカム) もあれば、一度に 1 つだけ実行してキューに入れる (ハニカム以降) こともあります。スレッド エグゼキューターを変更して並列実行できるようにすることもできます。AsyncTask クラスのドキュメントを参照してください。ただし、これはアプリの残りの部分にも影響します。

また、一度実行した AsyncTask は再利用できないことに注意してください。

于 2013-08-02T13:37:44.287 に答える