作为一个实验,我运行了以下代码片段(简化):
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在其初始值时似乎已冻结。这怎么可能是?
编辑:我需要解决这个问题,因为我想减少程序中垃圾收集的需求。
发布于 2012-02-25 13:03:34
Calendar被认为是日历中的“标记”。它更像是一个时间点,而不是当前时间的接口。(否则它为什么要设置函数呢?)
因此,ans2被“冻结”的原因是,GlobalCal.getTimeInMillis();将始终引用在构造函数中调用Calendar.getInstance()的时间(您曾经这样做过)。
我需要解决这个问题,因为我想减少程序中垃圾收集的需求。
垃圾收集是你程序的瓶颈吗?Calendars的数量是GC的瓶颈吗?你分析过你的程序了吗?
算了吧..。代之以呼叫System.currentTimeMillis。
发布于 2012-02-25 13:05:04
GlobalCal是在oncreate方法中初始化的。在那之后,它没有修改。那你想怎么改变呢?
顺便说一句,java中的变量名以小写字母开头,并遵循camel大小写。
https://stackoverflow.com/questions/9444224
复制相似问题