【问题标题】:Best way to configure AsyncTask for use in autocomplete search配置 AsyncTask 以用于自动完成搜索的最佳方式
【发布时间】:2016-01-09 00:41:06
【问题描述】:

我在 SearchView 的 onQueryTextChange 方法中调用 AsyncTask 并在列表中显示结果。搜索有效,但如果用户在搜索视图中快速键入,有时会挂起一秒钟。我想进一步优化这种方法。由于它是一个自动完成搜索,当用户开始输入时,几个 AsyncTask 会排队等待执行。但我只对最后一个搜索请求感兴趣。

目前,我正在做这样的事情

if (myAsyncTask != null)
    myAsyncTask.cancel(true);

   myAsyncTask = new MyAsyncTask(context,URL);

有没有更好的方法来做到这一点?如果可能的话,我想做这样的事情

myAsyncTask.executeOnExecutor(new OptimizedExectionerService);

OptimizedExectionerService 类应该取消池中所有挂起和正在运行的任务,并且只处理发出的最后一个请求。

【问题讨论】:

    标签: android performance android-asynctask


    【解决方案1】:

    使用具有合理延迟的处理程序(处理输入编辑文本)。

    private static final int SEARCH_DELAY = 500;
    private Handler mHandler = new Handler();
    private SearchRunnable executeSearch = new SearchRunnable();
    
    private queueSearch(String term) {
        // Remove any previous searches
        mHandler.removeCallbacks(executeSearch);
    
        // Set the search term for the runnable
        executeSearch.setSearchTerm(term);
    
        // Schedule the search in half a second
        mHandler.postDelayed(executeSearch, SEARCH_DELAY);
    }
    
    private class SearchRunnable implements Runnable {
        String searchTerm = null;
    
        public void setSearchTerm(String term) {
            searchTerm = term;
        }
    
        @Override
        public void run() {
             //Execute Search here
             new MyAsyncTask(context, searchTerm);
        }
    };
    

    【讨论】:

    • 测试后效果不好。删除回调仅适用于待处理消息
    • postDelayed 应该让 executeSearch 在执行前等待半秒 (SEARCH_DELAY)(这意味着它在这 500 毫秒内处于等待状态)。如果用户每 500 毫秒输入超过 1 个字符,则旧的待处理搜索将在它们在 asyncTask 中执行之前被删除,并且只有用户完成输入后的最后一个搜索才会真正执行。您可以使用搜索延迟来调整取消机制的工作情况。您可以从 onQueryTextChange 调用 queueSearch,也可以将 queueSearch 代码放在那里。
    • 此外,如果 MyAsyncTask 处理需要很长时间来执行/更新,(例如,如果您完成输入一秒钟然后再次开始输入),当 MyAsyncTask 完成时(onPostExecute)您可以检查是否搜索词(您刚刚进行了自动完成搜索)与当前搜索词匹配,如果不丢弃结果(不要解析它们或更新 UI)。
    • 经过仔细检查,每次进行查询时,我都会创建一个新的 Handler 和 SearchRunnable 实例,这是不正确的。您的代码完美运行!感谢您的帮助!
    猜你喜欢
    • 2014-12-27
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多