44

私は10と20の質問ゲームを持っています。ユーザーがゲームを終了するまでに経過した時間をカウントする必要があります。

Timer T=new Timer();
T.scheduleAtFixedRate(new TimerTask() {         
    @Override
    public void run() {
        runOnUiThread(new Runnable()
        {                
            public void run()
            {
                countdown.setText(""+count);
                count++;                
            }
        });
    }
}, 1000, 1000);

私はこれを使ってカウンターを止めます:

T.cancel();

今私は2つのものが必要です:

  • 経過時間をカウントして変数に保存する方法
  • 最終値を2倍にする必要があります。たとえば、最終スコアは15.49秒です。
4

5 に答える 5

84

ゲーム開始時:

long tStart = System.currentTimeMillis();

ゲームが終了したとき:

long tEnd = System.currentTimeMillis();
long tDelta = tEnd - tStart;
double elapsedSeconds = tDelta / 1000.0;
于 2013-03-06T13:41:14.853 に答える
62

Androidのドキュメント SystemClock.elapsedRealtime()によると、汎用のインターバルタイミングの推奨基準です。これは、ドキュメントによると、elapsedRealtime()が原因です。is guaranteed to be monotonic, [...], so is the recommend basis for general purpose interval timing.

SystemClockのドキュメントには、さまざまな時間メソッドとそれらに適用可能なユースケースの概要が記載されています。

  • SystemClock.elapsedRealtime()SystemClock.elapsedRealtimeNanos()は、汎用の経過時間を計算するための最善の策です。
  • SystemClock.uptimeMillis()別の可能性もありSystem.nanoTime()ますが、推奨される方法とは異なり、深い睡眠の時間は含まれていません。これが目的の動作である場合は、使用しても問題ありません。それ以外の場合は。に固執しelapsedRealtime()ます。
  • System.currentTimeMillis()これは「壁時計時刻」を返すので、近づかないでください。実時間は前後にジャンプする可能性があるため、経過時間の計算には適していません。NTPクライアントのような多くのものは、実時間のジャンプとスキューを引き起こす可能性があります。これにより、に基づく経過時間の計算currentTimeMillis()が常に正確であるとは限りません。

ゲーム開始時:

long startTime = SystemClock.elapsedRealtime();

ゲームが終了したとき:

long endTime = SystemClock.elapsedRealtime();
long elapsedMilliSeconds = endTime - startTime;
double elapsedSeconds = elapsedMilliSeconds / 1000.0;

また、Timer()はベストエフォートタイマーであり、常に正確であるとは限りません。そのため、ゲームの期間中にタイミングエラーが蓄積されます。中間時間をより正確に表示するにSystem.currentTimeMillis()は、に送信される時間の基準として定期的なチェックを使用しsetText(...)ます。

また、を使用する代わりに、を使用Timerすることを検討するTimerTaskこともできます。このクラスは、実行したいことのために設計されています。唯一の問題は、カウントアップではなくカウントダウンすることですが、それは単純な減算で解決できます。

于 2013-09-01T03:12:28.607 に答える
12

さらに良い!

long tStart = System.nanoTime();
long tEnd = System.nanoTime();
long tRes = tEnd - tStart; // time in nanoseconds

nanoTime()に関するドキュメントを読んでください!

于 2014-07-24T00:27:09.340 に答える
1

これを実現する方法はたくさんありますが、経過時間を測定するための最も重要な考慮事項は、時間単位として使用することSystem.nanoTime()ですTimeUnit.NANOSECONDSなぜ私はこれをする必要がありますか?これは、System.nanoTime()メソッドが、ある参照ポイント(つまり、Java仮想マシンの起動)からナノ秒単位で高解像度のタイムソースを返すためです。

この方法は経過時間を測定するためにのみ使用でき、システムや実時間のその他の概念とは関係ありません。

同じ理由で、System.currentTimeMillis()経過時間を測定する方法の使用を避けることをお勧めします。このメソッドはwall-clock時間を返しますが、これは多くの要因に基づいて変化する可能性があります。これは、測定値にとってマイナスになります。

戻り値の時間の単位はミリ秒ですが、値の粒度は基盤となるオペレーティングシステムによって異なり、それよりも大きくなる場合があることに注意してください。たとえば、多くのオペレーティングシステムは、数十ミリ秒の単位で時間を測定します。

したがって、ここでは、メソッドに基づく1つのソリューション、 GuavaSystem.nanoTime()を使用する別のソリューション、および最後の1つのApacheCommonsLangがあります。

public class TimeBenchUtil
{
    public static void main(String[] args) throws InterruptedException
    {
        stopWatch();
        stopWatchGuava();
        stopWatchApacheCommons();
    }

    public static void stopWatch() throws InterruptedException
    {
        long endTime, timeElapsed, startTime = System.nanoTime();

        /* ... the code being measured starts ... */

        // sleep for 5 seconds
        TimeUnit.SECONDS.sleep(5);

        /* ... the code being measured ends ... */

        endTime = System.nanoTime();

        // get difference of two nanoTime values
        timeElapsed = endTime - startTime;

        System.out.println("Execution time in nanoseconds   : " + timeElapsed);
    }

    public static void stopWatchGuava() throws InterruptedException
    {
        // Creates and starts a new stopwatch
        Stopwatch stopwatch = Stopwatch.createStarted();

        /* ... the code being measured starts ... */

        // sleep for 5 seconds
        TimeUnit.SECONDS.sleep(5);
        /* ... the code being measured ends ... */

        stopwatch.stop(); // optional

        // get elapsed time, expressed in milliseconds
        long timeElapsed = stopwatch.elapsed(TimeUnit.NANOSECONDS);

        System.out.println("Execution time in nanoseconds   : " + timeElapsed);
    }

    public static void stopWatchApacheCommons() throws InterruptedException
    {
        StopWatch stopwatch = new StopWatch();
        stopwatch.start();

        /* ... the code being measured starts ... */

        // sleep for 5 seconds
        TimeUnit.SECONDS.sleep(5);

        /* ... the code being measured ends ... */

        stopwatch.stop();    // Optional

        long timeElapsed = stopwatch.getNanoTime();

        System.out.println("Execution time in nanoseconds   : " + timeElapsed);
    }
}
于 2019-05-22T08:17:15.457 に答える
1

Java 8以降では、次のことを試すことができます。

import java.time.*;
import java.time.temporal.ChronoUnit;

Instant start_time = Instant.now();
// Your code
Instant stop_time = Instant.now();

System.out.println(Duration.between(start_time, stop_time).toMillis());

//or

System.out.println(ChronoUnit.MILLIS.between(start_time, stop_time));
于 2019-12-26T08:51:51.440 に答える