まずはい、AsyncTaskはこれを行うには良い方法です。私があなたのアプローチで見る問題は、何かが死ぬのを待っているタイマーです。 asyncTaskを呼び出すと、その参照を保持します。それがあなたのために状態を保つようにしてくださいそれはあなたが探しているか、それが戻ってきたかどうかを知っている。ユーザーが別の文字をクリックすると、asyncTaskをキャンセルすることができます。このようなもの:
public void onClick() {
if(searchTask != null) {
searchTask.cancel();
}
searchTask = new SearchTask(MyActivity.this).execute(textInput.getText());
}
public class SearchTask extends AsyncTask<String,Integer,List<SearchResult>> {
private boolean canceled = false;
protected onPostExecute(List<SearchResult> results) {
if(!canceled) {
activity.handleResults(results);
}
}
public void cancel() {
canceled = true;
}
}
これは、onPostExecute()がUIスレッド上にあるため安全です。また、cancel()はUIスレッドからのみ呼び出されるため、スレッドの安全性の問題はなく、同期する必要はありません。スレッドダイを見る必要はありません。 GCがクリーンアップするようにしてください。 AsyncTaskへの参照を削除すると、それは単にクリーンアップされます。 AsyncTaskがブロックされているのは、バックグラウンドスレッドのみをハングアップするためです。タイムアウトが発生すると、onPostExecute()を呼び出して再開します。これにより、Timerを使用せずにリソースを最小限に保ちます。
このアプローチについて考慮すべき事項。新しい文字が入力されるたびに新しいリクエストを送信すると、最初の数文字が最大の検索結果を生成するため、サーバーに負荷がかかる可能性があります。サーバーから返す結果の数を制限するか(例:最大10-50件)、結果を保持するのに十分な文字が入力されるまで待機します(3など)。ユーザータイプをより多くの文字にすることの問題は、フィードバックが3文字までキックオフされないことです。しかし、それはあなたのサーバーのヒットを劇的に減らすということです。
データベースから検索する場合は、実際に検索を停止することはできません。それは本当にそれを長く取っていますか?そうであれば、そのような動的検索の完了を実装すべきではないでしょう。 – Falmarri
実行可能なAsyncTaskの数には制限があります。以前のバージョンのAndroidではそれは低かった。最近のものでは無視することができます。 – Reno