作为一项实验,我运行了以下代码段(简化):
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在其初始值处显示为冻结。怎么会这样?
编辑:我需要解决此问题,因为我想减少程序中垃圾收集的需要。
答案 0 :(得分:1)
Calendar
被认为是日历中的“标记”。它更像是一个时间点,而不是当前时间的界面。 (为什么它还有set-functions?)
因此,ans2
被“冻结”的原因是因为GlobalCal.getTimeInMillis();
总是指你在构造函数中调用Calendar.getInstance()
的时间(你做过一次)。
我需要解决这个问题,因为我想减少程序中垃圾收集的需要。
垃圾收集是你程序的瓶颈吗? GC的瓶颈Calendars
的数量是多少?你有没有想过你的程序?
别介意......请致电System.currentTimeMillis
。
答案 1 :(得分:0)
GlobalCal在oncreate方法中初始化。之后不会修改它。那你怎么想改变呢?
顺便说一下,java中的变量名以小写字母开头,后面跟着驼峰。