gpt4 book ai didi

android - 如何避免两个 Chronometers 开始时间之间的毫秒差异?

转载 作者:太空宇宙 更新时间:2023-11-03 10:59:09 26 4
gpt4 key购买 nike

我在一个 Activity 中有两个计时器。First Chronometer 是耗时,Second Chronometer 是间隔时间。

例如:-我们选择了 5 分钟耗时和 30 秒间隔时间,现在我们通过按 btn_start 同时启动两个计时器。两个计时器都从 0 开始,现在当间隔计时器到达 00:30 时,它会再次从 0 重新启动。

现在的问题:-正如我交叉检查的那样,两个计时器的启动时间相差几毫秒。稍后变成 1 秒、2 秒、3 秒或更多秒的差异。

下面是Custom Chronometer.Java

public class PausableChronometer extends Chronometer implements PlaybackStateView {
// Keeps track of how far long the Chronometer has been tracking when it's paused. We'd like
// to start from this time the next time it's 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();

}

}

在单击按钮时我执行以下操作:

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

请告诉我,如何避免两个计时器开始时间之间的毫秒差异?

最佳答案

正如 Anton Malyshev 所说,无法避免两个不同计时器的开始时间不同。

我使用 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);
}

使用上述解决方案,我的问题已解决。

关于android - 如何避免两个 Chronometers 开始时间之间的毫秒差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48946735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com