我有一个相当简单的列表,每行有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],告诉这是没有错的
任何想法或提示我们如何加快速度?
非常感谢!
它几乎听起来像你获得更多的更新比你能够绘制 - 你试过减少更新频率到10秒来测试这个?如果这有帮助,您将需要找到一个解决方案,以便在每次更新时从任务中清除队列。如果您认为自动垃圾收集可能需要1秒钟(希望不会更多),并且其他服务可能会延迟更新,那么通常会有2秒的时间。 – 2010-09-27 16:33:40
调用是连续的,所以当前一个完成时执行新的调用。 – Albert 2010-09-28 07:44:24
垃圾收集器最糟糕的情况需要超过200毫秒,与应用程序在每次重绘时遇到的1.5 - 2秒UI挂起相比,这并不算什么。 刷新频率在这里没有影响,即使我将它提高到10秒,在通话结束后重绘也会继续冻结2秒 – Albert 2010-09-28 07:44:24