- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在一个 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/
我想扩展 Chronometer 类并添加我的代码。 我怎样才能做到呢?我尝试过,但无法使用 View 字段获取 Chronometer 构造函数。我得到一个异常,很明显: ... android.v
我正在编写一个基于 android.widget.Chronometer 的简单国际象棋时钟应用程序。我将它与 setCountDown(true) 标志一起使用,所有逻辑都运行良好。每个 Chron
我有一个应用程序在其主要 Activity 中包含计时码表。 Chronometer 用作计时器。一旦设备的屏幕关闭,这个定时器应该继续运行。我注意到,一旦计时器开始运行并且我将屏幕关闭较长时间,然后
我开发了自己的 Chronometer 实现。我做了以下操作: 创建一个服务 (CronoService),它使用执行线程的 Runnable 对象。 Runnable 将每 0.1 秒循环一次。 将
我有一个应用程序,我在其中向用户显示他正在做的事情的计时器。每当 Activity 进入后台(通过主页按钮或返回)时,我都会保存该时间(以秒为单位),当 Activity 恢复时,我想继续从同一时间开
我正在尝试使用 Chronometer 在我的 Android 应用程序中创建一个恢复按钮。到目前为止,我有 resume 方法的代码 fragment : private long pauseRes
我创建了一个应用程序,它有一个切换按钮来启动和停止计时器,例如秒表。当您第一次按下切换按钮(执行 .start())时,计时器将开始计时,当您再次按下按钮(执行 .stop())时,计时器出现在屏幕上
我有一个 View ,我想在上面添加一个计时器。然后,在绘制时我想显示当前时间。这是我的做法: public class MyView extends View { private C
在Android的SDK中,为我们提供了一个计时器,这个计时器称为Chronometer,我们可以成它为Android的一个组件,同时它也具备自己独有的方法。下面我们举例介绍下这个计时器的使用以及常
我正在尝试在我的白噪音应用程序中实现计时器。 应用程序有 4 个按钮可设置不同的曲调,以及 4 个功能按钮:播放/暂停、停止、一小时和三小时。最后两个正在倒计时模式下运行。 private Chron
我遇到了这个奇怪的问题,它困扰着我。我不明白为什么我在 MainActivity 中初始化计时器时会得到这个 NullPointerException。如果我在 SecondActivity 中初始化
我一直在玩弄 Android Studio,我正在尝试使用 Chronometer 小部件实现一个简单的计时器。首先我尝试了这段代码: import android.os.Bundle; import
我在一个 Activity 中有两个计时器。First Chronometer 是耗时,Second Chronometer 是间隔时间。 例如:-我们选择了 5 分钟耗时和 30 秒间隔时间,现在我
我有一个计时器,从用户遇到该 Activity 时开始计时 我目前正在使用 onCreate 期间设置的 Chronometer(最初仅在满足某些条件时才启动)。但我需要计时器继续向上计数,直到应用程
android 中的计时器如何检查计时器是否正在运行或停止?如果开始然后我想停止它,如果不运行然后启动计时器。 最佳答案 您可以使用 bool 变量来检查这一点。当您启动计时器时,您将 bool 变量
我有这个秒表需要在 30、45 和 60 秒后播放声音。 这是我的代码: @Override protected void onCreate(Bundle savedInstanceState) {
所以我的应用有 1 个 Activity 和 4 个 fragment ,其中一个有 Chronometer 来显示经过了多少时间。 它工作正常,但我有一个问题,每次我移动到另一个 fragment
我发现如果我在 setBase(SystemClock.elapsedRealtime()) 之后立即调用 start() 它将从 00:00 开始计数(这很好),见下文: startButton.s
我试图在 10 秒时停止我的 android 计时器,但我似乎无法让它工作。 我的代码如下,任何人都可以指出我正确的方向。 谢谢。 if(chronorun == false){ c
我以编程方式创建了计时器。但我不知道如何增加计时器文本的大小。以下是我的代码。我已将初始值设置为 00:00,但这个文本看起来很小,我想增加它的大小。请帮忙。 protected void onCre
我是一名优秀的程序员,十分优秀!