2012-03-01 59 views
0

編輯:我已經在下面發佈了我的解決方案(基本上,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更新的最有效方式的其他想法?

回答

0

你是1秒

_timerUpdateHandler.postDelayed(這一點,1000)延遲;

您的代碼無法隨時運行。

+0

1秒鐘是我希望更新時鐘的頻率。延遲等待那一秒,然後再調用更新文本的迭代。我認爲1秒鐘的時間足以讓我列出的代碼運行,這不是很多指令,大多數手機都有1ghz處理器。是否有一些特定的代碼可以讓你相信它需要一秒多的時間才能運行,或者你是否從我發佈的測試結果中顯示的積壓中推斷出它?我會將它更新到5秒鐘並讓它運行,只是爲了查看它是否至少與一小時保持一致。 – maxx233 2012-03-01 03:23:28

+0

只需要其他信息,這裏是將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

+0

...Aaand,應用程序終於完全鎖定,並在49分鐘時關閉。這實際上讓我感到驚訝,我期待着每5秒減少更新而不是每1秒會產生更爲顯着的影響 - 將我認爲會延長的時間延長5倍。這真的讓我相信有些東西不能正確回收並放棄內存資源 – maxx233 2012-03-01 04:20:49

0

呃..你不知道嗎..這不是我的Handler問題,或者其他任何類似的問題。它或者是ListView的效率低下,或者是發生在ArrayAdapter中的一些funkiness(我使用的是儘可能簡單的)。我製作了一個沙箱項目(下圖),並將我的7個ActivityTimers實例化成了一個ArrayList,然後使用每個對象來遍歷該數組,以實例化從數組傳遞ActivityTimer副本的ActivityControl。我之前做過的所有事情,只是用ScrollView中包含的LinearLayout來替換ListView。 16分鐘後,我有7個ActivityControls大概每隔一秒鐘,並保持準確的時間。甚至在30分鐘後,表現出的問題沒有略帶這裏就是我所做的(因爲它應該是!):

public class Sandbox_Experiments extends Activity { 
ArrayList<com.maxx233.Sandbox.ActivityTimer> _ActivityTimers = null; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    _ActivityTimers = new ArrayList<com.maxx233.Sandbox.ActivityTimer>(); 
    View myLayout = findViewById(R.id.Info); 

    com.maxx233.Sandbox.ActivityTimer act1 = new com.maxx233.Sandbox.ActivityTimer(); 
    com.maxx233.Sandbox.ActivityTimer act2 = new com.maxx233.Sandbox.ActivityTimer(); 
    com.maxx233.Sandbox.ActivityTimer act3 = new com.maxx233.Sandbox.ActivityTimer(); 
    com.maxx233.Sandbox.ActivityTimer act4 = new com.maxx233.Sandbox.ActivityTimer(); 
    com.maxx233.Sandbox.ActivityTimer act5 = new com.maxx233.Sandbox.ActivityTimer(); 
    com.maxx233.Sandbox.ActivityTimer act6 = new com.maxx233.Sandbox.ActivityTimer(); 
    com.maxx233.Sandbox.ActivityTimer act7 = new com.maxx233.Sandbox.ActivityTimer(); 


    _ActivityTimers.add(act1); 
    __ActivityTimers.add(act2); 
    __ActivityTimers.add(act3); 
    __ActivityTimers.add(act4); 
    __ActivityTimers.add(act5); 
    __ActivityTimers.add(act6); 
    __ActivityTimers.add(act7); 


    for (int i = 0; i < __ActivityTimers.size(); i++) 
    { 
     ActivityControl ac = new ActivityControl(this, (com.maxx233.Sandbox.ActivityTimer)__ActivityTimers.get(i)); 
     ac.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT)); 
     ((LinearLayout)myLayout).addView(ac); 
    } 
} 

}

所以我就搞清楚它是關於有什麼spcifically工作在導致這樣的問題的公式中的ListView,然後我會更新這個線程,以防其他人有類似的問題。除非那裏的其他人碰巧已經知道爲什麼ListView會每秒鐘更新少量對象,因此需要更多的資源?