ゲームでのアクティビティがあり、ユーザーがプレイしている時間を測定したいと考えています。
ゲーム アクティビティには、2 つの長い変数があります。
static long stopTime = 0;
static long startTime = -99;
onResume()
開始時刻と終了時刻を次の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 に更新します。
次に、この値を取得してユーザーに提示する別のアクティビティにlong を渡し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? :)");
}
}
停止時間と開始時間の値を持つ Log.donResume
とonPause
メソッドがあると、これらのメソッドが予想よりも多く実行されていることがわかり、不当な値 (負またはゼロ) が返されます。また、ゲームが終了すると、レイアウトで 1 秒後に数字が 0 から 3 に変化することがわかります。
これをどのように回避すればよいですか?