2012-02-25 58 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