【问题标题】:Best practice to use AsyncTask in autocomplete?在自动完成中使用 AsyncTask 的最佳实践?
【发布时间】:2013-11-26 07:10:52
【问题描述】:

我正在使用异步任务来填充来自服务器的自动完成建议。

问题: 当用户多次键入并删除edittext中的文本时。 假设他输入了很多次:咖啡>咖啡>咖啡>咖啡迟到....等等。 对于在 3 个关键字(阈值)之后更改的每个文本,我正在初始化一个异步任务并询问结果。 所以在当前情况下,我有很多线程在后台运行。所以我最新的一些异步线程正在等待机会。 整个这使我的应用程序非常慢。

我能做些什么来解决这个问题?

【问题讨论】:

  • 您应该在用户每次输入三秒后启动 1 或 2 秒的计时器。然后启动异步任务
  • 但这将停止最新的线程甚至执行
  • 我试图取消当前任务并再次执行它给了我:java.lang.IllegalStateException: 无法执行任务:任务已经在运行。

标签: android multithreading android-asynctask


【解决方案1】:

如果可以一开始就从服务器加载整个数据...那么您可以避免重复调用 asynctask 并从服务器获取数据。这将提高您的应用程序的性能。如果 Listview 中显示的数据是 String,下面的链接显示了如何过滤它:

http://www.androidhive.info/2012/09/android-adding-search-functionality-to-listview/

如果在 ListView 适配器中使用了自定义对象,请尝试:

Filtering ListView with custom (object) adapter

希望这会有所帮助。

【讨论】:

  • 数据非常庞大且动态。第一次无法加载。
【解决方案2】:

您应该在发布新任务之前取消当前任务。为此使用AsyncTask#cancel(true) 并确保可以快速停止任务的执行。这意味着在AsyncTask#doInBackground的正文中正确处理中断并频繁检查任务是否被取消。

并且您无法再次执行已取消的 AsyncTask。你必须创建一个新的。 (尝试再次执行会导致 IllegalStateExceptions)

【讨论】:

    【解决方案3】:

    每次更改文本(如果它仍在运行)时,取消任务对我有用。

    您需要在侦听器之外定义一次请求(类私有),然后通过(如果您的请求未完成,则取消它)启动您的侦听器功能。

    在函数之外定义你的请求

    private YourSearchTaskClass YourTaskReq = new YourSearchTaskClass();
    

    然后通过这个启动你的 addTextChangeListener/afterTextChanged

    if (YourTaskReq.getStatus()!= AsyncTask.Status.FINISHED)
       YourTaskAvReq.cancel(false);
    
    YourTaskReq= new YourSearchTaskClass(keyword);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      相关资源
      最近更新 更多