4

わかりましたので、私は Java と Android プログラミングの両方の初心者です。フレンドリーゲーム用のバスケットボールアプリケーションを作ろうとしています。現在、24 から 0 までカウントし、サウンドを再生し、ボタンでリセットされるショットクロックを作成しています。

public class MainActivity extends Activity {
    private ShotClock shotClock;
    private TextView shotClockTimer;
    private Timer timer = new Timer();
    private Button shotClockReset;
    private final static int interval = 100;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        shotClockTimer = (TextView) findViewById(R.id.shotClock);
        shotClockReset = (Button)findViewById(R.id.shotClockReset);
        shotClock = new ShotClock();
        shotClockReset.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                shotClock.shotClockReset();
            }

        });
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                TimerMethod();
            }

        }, 0, interval);

    }

    private void TimerMethod() {
        this.runOnUiThread(Timer_Tick);
    }

    private Runnable Timer_Tick = new Runnable() {
        public void run() {
            shotClock.advanceClock();
            shotClockTimer.setText(String.format("%.1f",shotClock.getSeconds()));

        }
    };
}

アイデアは、0.1秒ごとにタイマーがあり、それに応じてクロックを更新することです。これは正常に動作し、クロックは 24-0 からカウントされ、適切にリセットされます。私の問題は、それが正確ではないことです.3つの他のタイマーでテストしましたが、常に少し遅くなります.他のタイマーが0に達するまでに、これは残り約1〜1.5秒です. 原始的な方法で間隔を変更する以外に、より正確にするために何ができますか? 私は新しいので、仲良くしてください:)助けてくれてありがとう!

4

1 に答える 1

8

これは内部スケジューリングのためで、スケジューラは約 0.1 秒ごとにこのメソッドを呼び出します。ただし、システム自体は正確です。System.currentTimeMillis() を使用して、このエラーを修正してください。

Android 自体はリアルタイム アプリケーションではありませんが、システムは取得できる最も正確なソースです。

したがって、たとえばスポーツイベントの正確なストップウォッチをプログラミングすることは、Android では使用できません ;)

ループしてミリ秒のオフセットを計算するだけで、オフセットに達した場合はメソッドを呼び出します。

しかし、ここでも不正確さについて考えてみてください。最後の値ではなく、常に開始時間 (1*0.1 秒、2*0.1 秒...) を使用してオフセットを計算するため、ここでの不正確さを最小限に抑えます。

于 2013-02-17T09:43:49.190 に答える