在自动完成中使用AsyncTask的最佳做法?

时间:2013-11-26 07:10:53

标签: android multithreading android-asynctask

我正在使用Async任务从服务器填充自动完成建议。

问题: 当用户在edittext中输入和删除文本很多次。 让我说他输入:cofee> cof>咖啡>咖啡晚了....等多次。 对于每个文本在3个关键字(阈值)之后更改我正在初始化异步任务并请求结果。 所以在当前场景中我有很多线程在后台运行。所以我最近的一些异步线程正在等待机会。 整个这使我的应用程序非常慢。

我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:1)

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

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

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

Filtering ListView with custom (object) adapter

希望这有帮助。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

在函数

旁边定义您的请求
private YourSearchTaskClass YourTaskReq = new YourSearchTaskClass();

然后通过此

启动addTextChangeListener / afterTextChanged
if (YourTaskReq.getStatus()!= AsyncTask.Status.FINISHED)
   YourTaskAvReq.cancel(false);

YourTaskReq= new YourSearchTaskClass(keyword);