我正在实现一个位置建议活动,该活动将在用户在文本视图中键入内容时填充来自外部服务器的建议。每当文本视图中的文本更改时,我都使用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之间会有延迟吗?

最佳答案

AsyncTask reference


  可以通过调用cancel(boolean)随时取消任务。调用此方法将导致对isCancelled()的后续调用返回true。调用此方法后,在doInBackground(Object [])返回之后,将调用onCancelled(Object)而不是onPostExecute(Object)。为了确保尽快取消任务,如果可能的话(例如在循环内),应始终定期从doInBackground(Object [])检查isCancelled()的返回值。


因此,您实际上并没有取消doInBackground()步骤,除非您手动检查doInBackground中是否定期设置isCancelled()。在大多数版本的Android中,所有AsyncTasks共享一个线程,因此一个线程必须先完成才能启动下一个线程。因此,这就是您延迟的原因,但是我在doInBackground()代码中没有足够的信息(即,您没有发布代码),无法提出关于在哪里检查isCancelled()的建议。

如果由于某种原因无法取消上一个任务,您也可以尝试并行执行AsyncTask,并使用executeOnExecutor(java.util.concurrent.Executor, Object[])THREAD_POOL_EXECUTOR,如同一文档所建议的那样,但是您尝试这样做可能会导致令人沮丧的线程问题,这可能比您现在遇到的问题更严重。

关于android - android autocomplete AsyncTask延迟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36141097/

10-10 18:34