Ich implementiere eine Standortvorschlag Aktivität, die Vorschläge von einem externen Server füllt, wie der Benutzer in einer Textansicht eingibt. Ich verwende eine AsyncTask, um Vorschläge jedes Mal abzurufen, wenn sich der Text in der Textansicht ändert. Wenn ein neuer Brief eingegeben wird, brechen wir die bereits bestehende Aufgabe ab und führen eine neue aus. Die meiste Zeit doInBackground beginnt sofort nach execute wird aufgerufen, aber andere Male kann es ein paar Sekunden dauern. (Once doInBackground beginnt, ist die Leistung in Ordnung.)Android Autocomplete AsyncTask Verzögerung
Set Hörer:
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());
}
});
}
Hier beginnen wir eine neue Aufgabe und kündigen die vorherige:
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);
}
Gibt es einen besseren Fädelmechanik zu dafür benutzen? Weißt du warum es eine Verzögerung zwischen execute und doInBackground gibt?
Es könnte sein, dass die Aufgaben serialisiert sind und eine vorherige Aufgabe ihre Zeit zum Abbrechen benötigt. –
Das klingt sehr wahrscheinlich. Hast du eine Idee, wie du das umgehen kannst? – lf215