冷冻日历 - 为什么?

时间:2012-02-25 13:01:29

标签: java android eclipse

作为一项实验,我运行了以下代码段(简化):

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似乎是一个正确的,不断更新的值,但ans2在其初始值处显示为冻结。怎么会这样?

编辑:我需要解决此问题,因为我想减少程序中垃圾收集的需要。

2 个答案:

答案 0 :(得分:1)

Calendar被认为是日历中的“标记”。它更像是一个时间点,而不是当前时间的界面。 (为什么它还有set-functions?)

因此,ans2被“冻结”的原因是因为GlobalCal.getTimeInMillis();总是指你在构造函数中调用Calendar.getInstance()的时间(你做过一次)。

  

我需要解决这个问题,因为我想减少程序中垃圾收集的需要。

垃圾收集是你程序的瓶颈吗? GC的瓶颈Calendars的数量是多少?你有没有想过你的程序?

别介意......请致电System.currentTimeMillis

答案 1 :(得分:0)

GlobalCal在oncreate方法中初始化。之后不会修改它。那你怎么想改变呢?

顺便说一下,java中的变量名以小写字母开头,后面跟着驼峰。