我正在使用Async任务从服务器填充自动完成建议。
问题: 当用户在edittext中输入和删除文本很多次。 让我说他输入:cofee> cof>咖啡>咖啡晚了....等多次。 对于每个文本在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 / afterTextChangedif (YourTaskReq.getStatus()!= AsyncTask.Status.FINISHED)
YourTaskAvReq.cancel(false);
YourTaskReq= new YourSearchTaskClass(keyword);