-3

ゲームでのアクティビティがあり、ユーザーがプレイしている時間を測定したいと考えています。

ゲーム アクティビティには、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.donResumeonPauseメソッドがあると、これらのメソッドが予想よりも多く実行されていることがわかり、不当な値 (負またはゼロ) が返されます。また、ゲームが終了すると、レイアウトで 1 秒後に数字が 0 から 3 に変化することがわかります。

これをどのように回避すればよいですか?

4

1 に答える 1

1

あなたがやりたいことは、startTime と stopTime を静的にすることだと思います。これにより、これらの変数のそれぞれのインスタンスが 1 つしかないことがわかります。アクティビティがサイクルを通過しているときに状態を失っていると思います。

あなたがぶつかっているかもしれない他の問題は、SystemClock.currentThreadTimeMillis()おそらくあなたが望んでいるものではないということです。System.currentTimeMillis()おそらく、壁時計のミリ秒を取得するためにやりたいだけでしょう。

それがあなたを正しい軌道に乗せるか、コードを投稿して、もう少し支援できるかどうかをお知らせください。

于 2012-08-29T15:44:18.143 に答える