2010-09-27 130 views
5

我有一个相当简单的列表,每行有3个textview字段。我们正在与数据从后台Web服务调用(的AsyncTask)来更新每2秒或他们的价值观,从而Listview的ArrayAdapter notifydatasetchanged()非常缓慢的重绘

我们比较与当前那些未来值,相应地更新他们的适配器,最后调用notifyDataSetChanged()如果需要

事情是,当我们一次获得3个以上的更新行时,重绘变得非常慢,从而挂起整个UI。当然,我们正在使用所有ListView众所周知的优化,如EfficientAdapter方法(setTag()和持有者)和getViewTypecount()/ getItemViewType()。我们还试图尽可能优化我们的界面,并尽量避免wrap_content宽度和高度来减轻事情发展。

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

唯一奇怪的事情,我可以看到的是,getView()被调用的每一行3-4-5次,虽然我读过所有的罗曼的消息[1],告诉这是没有错的

任何想法或提示我们如何加快速度?

非常感谢!

[1] http://groups.google.com/group/android-developers/browse_thread/thread/4c4aedde22fe4594/aeb04288064f495e?show_docid=aeb04288064f495e

+0

它几乎听起来像你获得更多的更新比你能够绘制 - 你试过减少更新频率到10秒来测试这个?如果这有帮助,您将需要找到一个解决方案,以便在每次更新时从任务中清除队列。如果您认为自动垃圾收集可能需要1秒钟(希望不会更多),并且其他服务可能会延迟更新,那么通常会有2秒的时间。 – 2010-09-27 16:33:40

+0

调用是连续的,所以当前一个完成时执行新的调用。 – Albert 2010-09-28 07:44:24

+0

垃圾收集器最糟糕的情况需要超过200毫秒,与应用程序在每次重绘时遇到的1.5 - 2秒UI挂起相比,这并不算什么。 刷新频率在这里没有影响,即使我将它提高到10秒,在通话结束后重绘也会继续冻结2秒 – Albert 2010-09-28 07:44:24

回答

0

我想你可以设置标签UR的TextView作为URL在那里将得到更新。而不是调用“notifyDataSetChanged()”,你可以尝试为该视图使用findViewByTag(更新URL)和setText,所以textview只是一遍又一遍地重绘整个列表。将充分减少额外重绘次数。只是一个想法。

1

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

notifyDataSetChanged()可能比您手动更换的代码快得多,这一切都取决于您的实际listview实施。

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

手册notifyDataSetChange()

--- avg run-time: 4ms 

默认免费notifyDataSetChange()

--- avg run-time: 0ms <--- you can't get faster than this. 

不要运行创建自己的替代,除非你的时间和基准你的东西。使用免费的东西,直到必要的。