私は、ユーザーがテキストビューで入力するときに、外部サーバーからの提案を入力する場所提案アクティビティを実装しています。テキストビューのテキストが変更されるたびに、AsyncTaskを使用して候補を取得しています。新しい文字が入力されると、すでに存在するタスクをキャンセルして新しいタスクを実行します。ほとんどの場合、は、executeの直後に開始されますが、それ以外の時間は、数秒でとなる場合があります。 (。doInBackgroundが開始されると、パフォーマンスは結構です)android autocomplete AsyncTask delay
セットリスナー:
private void init() {
// respond to any text change
textView.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(final CharSequence s, int start, int b, int c) {
showSuggestions(s.toString());
}
});
}
ここでは、新しいタスクを開始し、前のものを取り消す:
private void showSuggestions(String query) {
// suggestionsTask is an instance variable of the activity
if (suggestionsTask != null) {
suggestionsTask.cancel(true);
}
suggestionsTask = new AsyncTask<String, Void, List<Suggestion>>() {
@Override
protected void onPostExecute(List<Suggestion> resultList) {
// set suggestions with adapter - CHANGES STATE
}
@Override
protected List<Suggestion> doInBackground(String... query) {
// one local db call for recent searches - DOES NOT CHANGE STATE
// one network call to external server - DOES NOT CHANGE STATE
// return results
}
};
suggestionsTask.execute(query);
}
は、より良い糸通し機構は、にありますこれを使う? executeとdoInBackgroundの間に遅延がある理由を知っていますか? AsyncTask referenceから
タスクがシリアル化され、前のタスクがキャンセルするのに時間がかかることがあります。 –
これはおそらく聞こえます。あなたはそれを回避する方法について考えていますか? – lf215