0

ストップウォッチのようなコードを含むアクティビティを作成しました。本当に正確である必要があります。問題は、リアルタイムで徐々に遅れることです。問題のコードの小さな例を次に示します。

import java.util.Date;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {

public static final int TIME_STEP = 500;    // milliseconds between updates
private Handler mHandler = new Handler();
private long mTimeElapsed = 0;

private Runnable mUpdateTimeTask = new Runnable()
{
    private long mOldTime = 0;      // previous real time (ms) that run() was called

    public void run()
    {
        mHandler.postDelayed(mUpdateTimeTask, TIME_STEP);

        long currentTime = new Date().getTime();
        long realDelay = currentTime - mOldTime;    // the actual delay between successive calls to run()
        if (mOldTime != 0)
            mTimeElapsed += realDelay;
        Log.d(this.toString(), "time elapsed = " + mTimeElapsed/1000);

        // some slow operations here...

        mOldTime = currentTime;
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTimeElapsed = 0;
    mHandler.removeCallbacks(mUpdateTimeTask);
    mHandler.postDelayed(mUpdateTimeTask, 0);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}
}

問題を説明すると、(logcat タイムスタンプによると) 8:23 の間アプリを実行した後、mTimeElapsed は 456 秒、つまり 7:36 になります。

run() の連続呼び出し間の遅延は getTime() を使用して計算されるため (つまり、実際の遅延が TIME_STEP になるとは想定していません)、なぜこれが同期から外れるのか理解できませんか?

エミュレーターと実際のデバイスでこれをテストしましたが、同じ結果が得られました。

編集:時間の結果は投稿されたコード、つまり「遅い操作」がない場合でも、ここで作業を行うと遅延が悪化するようです

同じことを達成するための代替方法を提供しないでください。私は代替案自体に反対しているわけではありません。このコードが期待どおりに機能しない理由を知りたいだけです。ありがとう!

4

2 に答える 2

2

時間の計算やその他のメソッドで何が起こっているのか、コードを追加しないと不明確です。ただし、明らかなことは、メソッドが経過時間を正しく測定していないように見えることです。

私が見ることができることから、「経過時間」はrun()呼び出し間の遅延で構成されています。これは、プログラムの開始からの経過時間と同じにはなりません。これは、これらのポイント間で、この失われた時間の発生の原因となる小さなことがたくさん発生すると想定しているためです。単に開始時刻を取得して、現在の時刻と開始時刻の差を計算するだけではない理由はありますか?

于 2012-11-05T18:56:14.110 に答える
0

いくつかの注意:

a)mTimeElapsedで正確に何を計算しようとしているのか明確ではありませんか?活動に費やす全体的な時間を計算しようとしていますか?run()に費やされた全体的な時間を計算しようとしていますか(「遅い操作」に費やされた時間とほぼ同じです)?run()の外部で費やされた全体的な時間を計算しようとしていますか?

b)コードに基づいて、run()の終了とrun()の次の実行(実行の追放に費やされた時間)の間に費やされた時間(およそ)を計算します。これはあなたが必要なものですか?

于 2012-11-05T18:47:41.767 に答える