Android告诉用户玩了多少时间

时间:2012-08-29 15:30:15

标签: java android

我有一个游戏活动,我想测量用户玩的时间。

在游戏活动中,我有两个长变量,

static long stopTime = 0;
static long startTime = -99;

我试图将onResume()中的开始时间设置为onPause()中的结束时间,如下所示:

的onPause:

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    stopTime = SystemClock.currentThreadTimeMillis();
    Log.d("OnPause","stopTime: "+stopTime);
}

的onResume:

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    if (startTime == -99)
    {
        startTime = SystemClock.currentThreadTimeMillis();
        Log.d("OnPause","THIS IS RESUME : startTime: "+startTime);
    }
}

当我首先发起startTime时,我给它一个-99的值,所以只有当它是onResume中的值时,我才会将它的值更新为currentmillis。

然后传递stopTime - startTime长的长号 putExtra("totalTime", this.stopTime - this.startTime);到另一个获取此值并将其呈现给用户的活动。我这样做,使用一个名为moveToEndScreen()的方法,在游戏结束时调用:

private void moveToEndScreen() {
    // TODO Auto-generated method stub
    Intent i = new Intent(con, EndScreen.class);
    i.putExtra("err", errTimes);
    i.putExtra("timeScore", stopTime - startTime);
    startActivity(i);
}

这就是下一个活动的结果:

public class EndScreen extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    Intent i = getIntent();
    long timeScore = i.getLongExtra("timeScore",15);
    Log.d("END SCREEN timeScore THAT I GOT IS",timeScore+"");
    float timeResult = timeScore / 1000;
    int errors = i.getIntExtra("err", -1);
    setContentView(R.layout.endscreen);
    TextView stat = (TextView) findViewById(R.id.errMsg);
    stat.setText("You have completed the puzzle in "+errors+" false matches total, and it took you "+timeResult+ " seconds. Can you do better? :)");

}

}

使用onResumeonPause方法中的Log.d以及停止和开始时间的值,我看到这些方法的运行次数超出了我的预期,并给出了不合理的值(负值)或零)。此外,我现在看到游戏结束时,布局上的数字在1秒后从0变为3。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我认为你想要做的是让startTime和stopTime成为静态,这样你才知道每个变量只有一个实例。我认为当活动经历它的周期时你正在失去状态。

您可能遇到的另一个问题是您正在呼叫SystemClock.currentThreadTimeMillis(),这可能不是您想要的。你可能只想做System.currentTimeMillis()来获得挂钟毫秒。

如果能让您走上正轨或发布一些代码,请告知我们,以便我们提供更多帮助。