【发布时间】:2016-07-08 13:20:03
【问题描述】:
我正在实现一个位置建议活动,当用户在文本视图中键入时,它会从外部服务器填充建议。每次文本视图中的文本发生更改时,我都使用AsyncTask 来获取建议。当输入一个新字母时,我们取消已经存在的任务并执行一个新的。大多数情况下doInBackground 在调用execute 后立即启动,但其他时候可能需要几秒钟。 (一旦 doInBackground 启动,性能就很好了。)
设置监听器:
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之间会有延迟吗?
【问题讨论】:
-
可能是任务被序列化了,前一个任务需要时间取消。
-
听起来很有可能。你知道如何解决这个问题吗?
标签: android android-asynctask autocomplete