6

Android 2.2 用のクロノメーター / カウントダウン タイマー アプリを設計中ですが、ボタンを 1 回押すだけでクロノメーターとタイマーの両方を同時に開始したいと考えています。したがって、理想的には、クロノメーターとタイマーの両方の秒 (時間) を同じインスタンスで変更したいと思います。(クロノメーターがカウントアップしていても、タイマーはカウントダウンします)。Android が提供するクロノメーターとタイマー機能を使用しているので、ユーザーが [開始] ボタンを押したときに次のコードを記述しました。

private boolean mStartPressedOnce = false;
long mTimeWhenStopped = 0;
Chronometer mChronometer;   
MyCounter mCounter;
...
@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.StartButton:
        // Perform some initialization for the chronometer depending
        // on the button press
        if (mStartPressedOnce == false) {
            mChronometer.setBase(SystemClock.elapsedRealtime());
        } else {
            mChronometer.setBase(SystemClock.elapsedRealtime() + mTimeWhenStopped);
        }

        // Perform the initialization for the timer
        mCounter = new MyCount(45000, 1000);

        // Fire up the chronometer  
        mChronometer.start();

        // Fire up the timer
        mCounter.start();
        break;

        case R.id.ResetButton:
            // Reset the chronometer  
            mChronometer.setBase(SystemClock.elapsedRealtime());
            mTimeWhenStopped = 0;
            break;

        case case R.id.StopButton:
            mStartPressedOnce = true;
            // Stop the chronometer 
            mTimeWhenStopped = mChronometer.getBase() - SystemClock.elapsedRealtime();
            mChronometer.stop();
            break;
    }

... 

public class MyCounter extends CountDownTimer {

    @Override
    public MyCount(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
    }

    @Override
    public void onFinish() {        
        // Nothing to do here
    }

    @Override
    public void onTick(long millisUntilFinished) {
        long seconds = (long) (millisUntilFinished / 1000);
        long minutes = (long) ((millisUntilFinished / 1000) / 60);
        long hours = (long) (((millisUntilFinished / 1000) / 60) / 60);

        // Do some formatting to make seconds, minutes and hours look pretty    

        // Update the timer TextView            
       (TextView) findViewById(R.id.CountDownTimerTextView))
           .setText(hours + ":" + minutes + ":" + seconds);
    }
}

クロノメーターとタイマーの秒は最初は同期しているように見えますが、しばらくするとオフになり、両方の 2 番目の更新が異なる時間に発生します。

これを修正するために何ができるか考えていました。私は出会いました-そしてこのスレッドを読みました

複数の AsyncTask を同時に実行する -- 不可能ですか?

設計の変更が必要になる可能性があることは認識していますが、何を行う必要があるか正確にはわかりません。

編集:クロノメーターとタイマーのタイプと、クロノメーターを使用して時間を計算する方法が含まれています-jolivierとnjzk2の提案による

4

2 に答える 2

2

System.currentTimeMillis() で現在の時刻を取得し、それを変数に格納して と の両方に転送するとmChronometermCounterタスクが異なる時刻に開始されても同じ時刻参照を使用できます。

編集: 指定された型を使用すると、Chronometer に関する Android ドキュメントは、私が言ったことを達成するために経過リアルタイムを使用できることを示しています。 CountDownTimerにはこれがなく、そのstartメソッドは最終的なものであるため、別の実装を使用することをお勧めします。ユースケースをよりよく理解すると役立つ場合があります。

基本的に、2 つのスレッドが同じミリ秒でアクションを実行することは決して良い考えではありません。そのうちの 1 つはクロックとして機能し、もう 1 つはスレーブであり、クロックをリッスンする必要があります。

于 2012-11-20T12:51:27.990 に答える