編輯:我已經在下面發佈了我的解決方案(基本上,ListViews由於某種原因非常慢),並且會嘗試進一步更新它,如果我可以澄清爲什麼一個ListView在這種情況下非常糟糕。性能問題每秒更新多個用戶界面元素
目的:
獲取表示7獨立地設定時鐘/定時器哪個更新/蜱每秒7個的ListView對象。這些時鐘是隻是示出的計算出的經過時間字符串(SystemClock.ElapsedRealTime() - 存儲當對象被實例化的ElapsedRealTime()。)
問題:
基本上,8分鐘到這些7時鐘滴答作響 - 我的程序基本上是無用的..提供的信息不準確,用戶界面是幾乎沒有反應,等這裏是針對物理秒錶的基準測試的一些結果:
- 在04:00 ,時鐘正在滑動1秒,並且每4秒更新一次。
- 在06:00,時鐘正在滑動3秒,並且每5秒更新一次。
- 在08:00,時鐘正在滑動6-7秒,並且每6秒更新一次。
- 在16:00,時鐘正在滑動7秒,並且每10秒更新一次。
我有什麼至今:
我有一個自定義類,ActivityTimer,與存儲的長表示當每個ActivityTimer首次實例化的SystemClock.ElapsedRealTime()。通過點擊一個按鈕7次,我實例化其中的7個,每個都添加到一個ArrayList中我有一個複合視圖ActivityTimerControl,它在實例化時傳遞一個ActivityTimer,然後呈現ActivityTimer的數據元素在UI元素(如滴答時鐘)中。我的ArrayAdapter處理這個實例並且工作正常。按照this fine tutorial我有一個_Handler在這個ActivityControl,其在施工ActvityControl帖子這樣的:
private Runnable _timerUpdateTask = new Runnable()
{
public void run()
{
final long start = _ActivityTimer.getStartTime();
long millis = SystemClock.elapsedRealtime() - start;
int seconds = (int) (millis/1000);
int minutes = seconds/60;
seconds = seconds % 60;
if (seconds < 10)
{
_tglActivityPauseButton.setTextOn(""+minutes+":0"+seconds);
}
else
{
_tglActivityPauseButton.setTextOn("" + minutes + ":" + seconds);
}
_tglActivityPauseButton.setChecked(true);
_timerUpdateHandler.postDelayed(this, 1000);
}
};
其他比我描述我的項目真的沒有做任何事情,因爲我一直停留在迄今爲止的這個基本問題上。所以我還沒有發佈任何其他代碼,因爲我不認爲它的相關性超出了我上面提供的總結 - 但是如果有人覺得項目的其他部分是相關的,請讓我知道,我會發布詳細信息代碼。我將我的最終字符串呈現給ToggleButton的SetTextOn(),但測試表明這不是一個重要因素 - 無論我設置的是正常TextView的Text還是什麼,都沒關係事關我試過的結果總是大致相同,每個時鐘都有明顯的滯後,最終UI完全無法響應。
我的理解是,一個處理程序應該是一致的,並頻繁地更新UI元素,替代java.util.Timer中的最有效的方式,但儘管這樣我的代碼開始了緩慢而剛剛獲得的最差我讓它運行。
即使增加postDelay到5000ms,仍然會出現同樣的問題,並且應用在49分鐘後仍然強制關閉。因爲我會認爲這個測試會把時間延長到接近5的時間,如果不完全修復它(對我想要的功能不利),我懷疑某些東西不能與處理程序一起回收,或者一些其他組件。
我的問題:
- 我懷疑我的問題是在具有7個對象(ActivityControls),每個都有自己的處理器不斷循環的畫面上顯示的相應時間更新。有沒有人有經驗說如果這是事實?
- 有沒有一種方法我可以有一個單個處理程序調用我的ListView中的每個ActivityControl來更新它的時間?
- 向處理程序發佈消息會留下一些不會自動處理的內存跟蹤,還是可能受益於被迫處置?
- 其他人有沒有關於在多個對象上運行常量UI更新的最有效方式的其他想法?
1秒鐘是我希望更新時鐘的頻率。延遲等待那一秒,然後再調用更新文本的迭代。我認爲1秒鐘的時間足以讓我列出的代碼運行,這不是很多指令,大多數手機都有1ghz處理器。是否有一些特定的代碼可以讓你相信它需要一秒多的時間才能運行,或者你是否從我發佈的測試結果中顯示的積壓中推斷出它?我會將它更新到5秒鐘並讓它運行,只是爲了查看它是否至少與一小時保持一致。 – maxx233 2012-03-01 03:23:28
只需要其他信息,這裏是將postDelay設置爲5000ms的結果: +在04:00滑倒1秒。 UI每5秒更新一次(par)。 +在08:00滑倒3秒。 UI每8秒更新一次(慢3秒)。 +在16:00時滑倒8-9秒。 UI每11-13秒更新一次(慢6-8秒) – maxx233 2012-03-01 03:45:14
...Aaand,應用程序終於完全鎖定,並在49分鐘時關閉。這實際上讓我感到驚訝,我期待着每5秒減少更新而不是每1秒會產生更爲顯着的影響 - 將我認爲會延長的時間延長5倍。這真的讓我相信有些東西不能正確回收並放棄內存資源 – maxx233 2012-03-01 04:20:49