配置AsyncTask以在自动完成搜索中使用的最佳方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了配置AsyncTask以在自动完成搜索中使用的最佳方法相关的知识,希望对你有一定的参考价值。

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

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

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

   myAsyncTask = new MyAsyncTask(context,URL);

有一个更好的方法吗?如果可能的话,我想做这样的事情

myAsyncTask.executeOnExecutor(new OptimizedExectionerService);

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

答案

使用具有合理延迟的处理程序(处理在edittext中的输入)。

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);
    }
};

以上是关于配置AsyncTask以在自动完成搜索中使用的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

从 AsyncTask 返回数据到 MainActivity 的最佳方法

最佳实践:方向更改期间的 AsyncTask

自动完成街道、城市和国家的最佳 php 实现

建模音乐(音符)以在特定时间快速搜索音符的最佳方法

在主线程中等待 AsyncTask

将 Amadeus 机场和城市搜索自动完成添加到 Rails 应用程序