2012-02-25 95 views
0

作爲一個實驗我跑的下面的代碼段(簡化):冷凍日曆 - 爲什麼?

public class SGamePlay extends Activity implements View.OnClickListener 
{ 
    Calendar GlobalCal = null; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     GlobalCal = Calendar.getInstance(); 
    } 

    long time_in_ms() 
    { 
     long ans = -1; 
     long ans2 = -1; 

     Calendar LocalCal = Calendar.getInstance(); 

     ans = LocalCal.getTimeInMillis(); 

     ans2 = GlobalCal.getTimeInMillis(); 

     Log.e("game","ans="+ans+" ans2="+ans2); 

     return ans; 
    } 
    // much more code here... 
} 

的time_in_ms()函數是從一個子線程調用。問題是,雖然ans似乎是一個正確的,不斷更新的值,an​​s2似乎凍結在它的初始值。這怎麼可能?

編輯:我需要解決這個問題,因爲我想減少我的程序中垃圾收集的需要。

回答

1

Calendar被認爲是日曆中的「標記」。這更像是一個時間點,而不是當前時間的界面。 (這否則爲什麼有設置功能?)

那麼,爲什麼ans2被「凍結」的原因是因爲GlobalCal.getTimeInMillis();總是引用的時候,當你在構造函數稱爲Calendar.getInstance()(你做一次)。

我需要解決這個問題,因爲我想減少我的程序中垃圾收集的需要。

垃圾收集是你程序的瓶頸嗎? GC的瓶頸數是Calendars嗎?你有沒有分析你的程序?

不要緊......請致電System.currentTimeMillis

0

GlobalCal在oncreate方法中初始化。之後沒有修改。那麼你想如何改變呢?

順便說一句,java中的變量名以小寫字母開頭,並遵循駱駝大小寫。

+0

如果您旋轉設備,從而破壞您的活動並重新創建它,您將再次執行onCreate並更新您的日曆。選中此項,您將會明白,您不會更新GlobalCal,因爲您無法再通過onCreate方法。 – Snicolas 2012-02-25 13:06:28