2010-09-27 129 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. 

不要運行創建自己的替代,除非你的時間和基準你的東西。使用免費的東西,直到必要的。