gpt4 book ai didi

android - 在 Android 中同时启动两个(或更多)功能

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:05:48 25 4
gpt4 key购买 nike

我正在为 Android 2.2 设计一个计时器/倒数计时器应用程序,并希望按下一个按钮来同时启动计时器计时器。因此,理想情况下,我希望计时表和计时器 上的秒数(时间)在同一时刻发生变化。 (即使计时器正在计时,计时器也会倒计时)。由于我使用的是 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);
}
}

虽然天文台表和计时器上的秒数看起来最初是同步的,但在很短的时间之后,它们似乎停止了,并且两者的第二次更新发生在不同的时间。

想知道我能做些什么来解决这个问题。我确实遇到过 - 并阅读了这个帖子

Running multiple AsyncTasks at the same time -- not possible?

我意识到可能需要进行设计更改,但我不确定到底需要做什么。

编辑:包括计时器和计时器的类型以及使用计时器计算时间的方法 - 根据 jolivier 和 njzk2 的建议

最佳答案

您可以使用 System.currentTimeMillis() 检索当前时间,将其存储到变量中并将其转发给 mChronometermCounter,以便它们使用相同的时间引用,尽管他们的任务开始时间不同。

编辑:对于给定的类型,android documentation about Chronometer会告诉你可以使用elapsedRealTime实现我所说的。 CountDownTimer没有这个并且它的 start 方法是最终的,所以你可能想使用另一个实现,更好地了解你的用例可能会对我们有所帮助。

基本上,想要两个线程在同一毫秒执行一个 Action 从来都不是一个好主意,其中一个将充当时钟,另一个必须是从属并监听时钟。

关于android - 在 Android 中同时启动两个(或更多)功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13473547/

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