How can I avoid the difference in milliseconds between the two moments when the chronometer starts?

I have two Chronometer in activity. The first chronometer is for the elapsed time, and the second chronometer is for the time interval.

Example: - We selected 5 minutes elapsed time and an interval of 30 seconds, now we start both timers simultaneously by pressing btn_start. Both timers start at 0, now that the interval timer reaches 00:30, it restarts from 0 again.

Now the problem: - Since I cross-checked, both timers start with a millisecond difference. Which later becomes the difference of 1 second, 2 seconds, 3 seconds or more seconds.

The following is a custom timepiece. Java

public class PausableChronometer extends Chronometer implements PlaybackStateView {
    // Keeps track of how far long the Chronometer has been tracking when it paused. We'd like
    // to start from this time the next time it resumed.
    private long timeWhenStopped = 0;

    public PausableChronometer(Context context) {
        super(context);
    }

    public PausableChronometer(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public PausableChronometer(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void start() {
        setBase(SystemClock.elapsedRealtime() + timeWhenStopped);
        Log.e("start()", String.valueOf(SystemClock.elapsedRealtime() + timeWhenStopped));
        super.start();
    }

    @Override
    public void stop() {
        super.stop();
        timeWhenStopped = getBase() - SystemClock.elapsedRealtime();
    }

    /**
     * Reset the timer and start counting from zero.
     */
    @Override
    public void restart() {
        reset();
        start();
    }

    public void reset() {
        stop();
        setBase(SystemClock.elapsedRealtime());
        timeWhenStopped = 0;
    }

    @Override
    public void resume() {
        setBase(SystemClock.elapsedRealtime() - timeWhenStopped);
        start();
    }

    @Override
    public void pause() {
        stop();
        timeWhenStopped = SystemClock.elapsedRealtime() - getBase();

    }

}

On Clicked button I do the following:

private void startTimer() {
        intervalTimer.start();
        elapsedTimer.start();
    }

, , ?

+4
1

, .

Handler Runnable , .

private TextView elapsedTimer, intervalTimer;
Handler mHandlerElapsed = new Handler(), mHandlerInterval = new Handler();
Runnable mRunnableElapsed, mRunnableInterval;
private int nCounterInterval = 0, nCounterElapsed = 0;

: -

private void updateTime() {

        mHandlerElapsed = new Handler();
        mRunnableElapsed = new Runnable() {
            @Override
            public void run() {
                if (!isPause) {
                    mHandlerElapsed.postDelayed(mRunnableElapsed, 1000);
                    nCounterElapsed++;

                        elapsedTimer.setText(AppUtil.formattedTime(nCounterElapsed));                    

                } else {
                    mHandlerElapsed.removeCallbacks(mRunnableElapsed);
                }
            }
        };

        mHandlerElapsed.post(mRunnableElapsed);

        mHandlerInterval = new Handler();
        mRunnableInterval = new Runnable() {
            @Override
            public void run() {
                if (!isPause) {
                    mHandlerInterval.postDelayed(mRunnableInterval, 1000);
                    nCounterInterval++;
                    intervalTimer.setText(AppUtil.formattedTime(nCounterInterval));

                } else {
                    mHandlerInterval.removeCallbacks(mRunnableInterval);
                }
            }
        };
        mHandlerInterval.post(mRunnableInterval);
    }

: -

private void startTimer() {
        isPause = false;
        updateTime();
    }

 private void pauseTimer() {
        isPause = true;
        updateTime();
    }

AppUtil.java

 public static String formattedTime(int totalSeconds) {
        int seconds = totalSeconds % 60;
        int minutes = (totalSeconds / 60) % 60;
        if (totalSeconds >= 3600) {
            minutes = minutes + 60;
        }
        return String.format(Locale.US, "%02d:%02d", minutes, seconds);
    }

, .

0

Source: https://habr.com/ru/post/1694044/


All Articles