Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Listview';s ArrayAdapter notifydatasetchanged()非常慢的重绘_Listview_Android_Performance_Android Arrayadapter_Redraw - Fatal编程技术网

Listview';s ArrayAdapter notifydatasetchanged()非常慢的重绘

Listview';s ArrayAdapter notifydatasetchanged()非常慢的重绘,listview,android,performance,android-arrayadapter,redraw,Listview,Android,Performance,Android Arrayadapter,Redraw,我有一个非常简单的列表,每行有3个文本视图字段。我们正在使用来自后台Web服务调用(AsyncTask)的数据每隔2秒左右更新它们的值 我们将未来值与当前值进行比较,在适配器上相应地更新它们,并在需要时调用notifyDataSetChanged() 问题是重画速度非常慢,因此当我们一次得到3行以上的更新行时,整个UI都会挂起。当然,我们正在使用所有众所周知的ListView优化,例如EfficientAdapter方法(setTag()和holders)和getViewTypecount()/

我有一个非常简单的列表,每行有3个文本视图字段。我们正在使用来自后台Web服务调用(AsyncTask)的数据每隔2秒左右更新它们的值

我们将未来值与当前值进行比较,在适配器上相应地更新它们,并在需要时调用notifyDataSetChanged()

问题是重画速度非常慢,因此当我们一次得到3行以上的更新行时,整个UI都会挂起。当然,我们正在使用所有众所周知的ListView优化,例如EfficientAdapter方法(setTag()和holders)和getViewTypecount()/getItemViewType()。我们还尝试使用layoutopt尽可能优化我们的界面,并尝试避免包装内容的宽度和高度,以使内容更轻松

我们也不会对更新执行昂贵的操作,只是标准的操作:更改TextView文本、textcolor和backgroundcolor值

我能看到的唯一奇怪的事情是,getView()每行被调用3-4-5次,尽管我读过Romain的所有消息[1],告诉我这没有什么错

关于如何加快速度有什么想法或提示吗

多谢各位


[1]

我想你可以在你的文本视图中设置一个标签,作为它获取更新的url。您可以尝试为该视图使用findViewByTag(更新URL)和setText,而不是调用“notifyDataSetChanged()”,因此textview只会被重新绘制,而不是一次又一次地重新绘制整个列表。将充分减少额外重新绘制的数量。只是一个想法。

这是为那些从谷歌浏览的人准备的,他们认为需要重写自己的数据更改方法。根据我的数据,在很多情况下你不需要这样做

notifyDataSetChanged()
可以比手工编码的替换快得多,这完全取决于实际的
listview
实现

示例:一个简单的三行纯文本列表视图,最大行数为10K
ArrayList
通过菜单选择更新

手动
notifyDataSetChange()

默认自由
notifyDataSetChange()


——平均运行时间:0ms听起来你得到的更新比你能画的要多-你有没有试过将更新频率降低到10秒来测试这一点?如果这有帮助,您将需要找到解决方案,以便在每次更新时从任务中清除队列。如果你认为自动垃圾回收可以占用1秒(不希望更多),其他服务也可以延迟更新,那么2秒是很常见的。调用是连续的,所以在前一次完成时执行新的调用。垃圾收集器最坏情况超过200毫秒,与应用程序每次重画时所体验的1.5-2秒UI挂起相比,这算不了什么。刷新率在这里没有影响,即使我将其提高到10秒,在调用被触发后,重画将在这2秒钟内继续冻结。您在AsyncTask中尝试过这样做吗?使用探查器工具如何?DDMS对
notifyDataSetChanged()
计时有何评论?哦,我刚注意到问题的日期……你解决了吗?
--- avg run-time: 4ms
--- avg run-time: 0ms <--- you can't get faster than this.