CountDownTimer继续在后台打勾 – 如何在onResume中检索该计数?
我有一个有多个计时器的应用程序; 当我开始使用它时,我可以看到它在Eclipse中的Logcat中倒计时。
当我点击后退按钮时,在应用程序中调用onStop()
但是计时器继续在logcat中倒计时( onTick()
继续打勾)。
我想要的是当调用onResume()
时,我想得到那个仍在倒计时并继续它的计时器。 这可能吗?
这是我的按钮开始倒计时:
//Button1 Timer final CountDown button1 = new CountDown(420000,1000,bButton1); bButton1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { button1.start(); long currentTime = System.currentTimeMillis(); //Set start time for calculating time elapsed if needed saveTime("START_TIME_BUTTON1", currentTime); } }); //Button2 Timer final CountDown button2 = new CountDown(360000,1000,bButton2); bButton2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { button2.start(); long currentTime = System.currentTimeMillis(); //Set start time for calculating time elapsed if needed saveTime("START_TIME", currentTime); } });
我的onResume()
看起来像这样:
@Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); //Reset the timers on appropriate buttons if there was something running //If nothing was running or timer finished - have button in default state //See if there was a button1 timer running - if not, it will be 0 SharedPreferences start = PreferenceManager.getDefaultSharedPreferences(this); long startTime = start.getLong("START_TIME_BUTTON1", 0); long timeElapsed = (System.currentTimeMillis()-startTime); long timeRemaining = (420000 - timeElapsed); if (timeRemaining == 0) { } else if (timeRemaining > 0) { final CountDown button1Timer = new CountDown(timeRemaining,1000,bButton1); button1Timer.start(); long currentTime = System.currentTimeMillis(); saveTime("START_TIME", currentTime); } else { } }
这实际上是有效的 – onResume()
在第一个定时器的位置启动另一个定时器,文本显示相应的数字并继续使用onTick()
方法onTick()
。 但是现在logcat显示2个计时器倒计时而不是只有一个!
最终我不想再启动另一个计时器,我只想拿起我开始的第一个计时器,它当前正处于倒计时,并onTick()
显示onTick()
。 有没有办法做到这一点? 服务会成为我想要的吗? 它已经是一项服务,因为它继续在后台打勾吗?
关于完成这项工作的最佳做法,我有点困惑。
onTick()
将继续被调用,直到剩余时间达到0或你在CountDownTimer上调用cancel()
。 因此,在onStop()
方法中,您需要在要停止接收onTick()
通知的计时器上调用cancel()
。
Android的CountDownTimer实现使用Handler
通过排队在每次滴答后发送给Handler
的Message
来执行计时。 不幸的是,没有办法暂停CountDownTimer,所以我相信你需要创建一个具有适当值的新Timer
,就像你现在正在做的那样。
当您计算timeElapsed时,不应使用System.currentTimeMillis()
因为它可以随时更改,而应使用SystemClock.elapsedRealtime()
。 System.currentTimeMillis()
是用于挂钟(时间和日期)的计时器,因此可以无法预测地更改,请参阅Android文档 。
- 单击第1项时的Android CarouselPicker
- Eclipse中的java.lang.NoClassDefFoundError,但不包含Ant
- 我们如何在Android中复制文件并保留其只读属性?
- 使用Java For Android的HTTP API请求
- 预计BEGIN_ARRAY但是BEGIN_OBJECT改造2
- Android 2.2 SDK – Droid X Camera Activity无法正常完成
- 如何删除此错误? java.lang.reflect.InvocationTargetException
- 在Android中的ScrollView中的图像
- 序列化循环对象树 – StackOverflowError – 需要自定义序列化代码