0

不幸的是,我的架构不起作用,所以我需要你的帮助。

我要解决的问题:

我编写了一个小游戏,您可以在其中选择“跑步 1 分钟”等练习。

  • 在应用程序的任何位置显示倒计时:片段、活动、操作栏...
  • 完成后做任务
  • 如果离开片段,倒计时应该提前运行
  • 如果我回到片段,倒计时应该再次以正确的进度

我尝试在实现 CountDownTimer 时解决问题。但是如果 countDownTimer 是片段的一部分,如果我离开片段,它将被销毁。当我回来时,倒计时从头开始......

所以我想到了一个线程......但是我怎样才能在片段和我想要的任何其他地方显示倒计时?

在他完成之前线程会一直存在吗?即使我关闭应用程序?

所以你能说出一些我可以搜索来解决问题的关键字吗?还是描述解决方案?

感谢您的建议;)

4

2 回答 2

2

您可能应该将您的计数器放在一个服务中,该服务将作为远程进程运行,并在您需要显示计时器的任何地方绑定到该服务,然后使用观察者模式从您的服务 CountDownTimer 的 onTick 方法中调用侦听器回调,只要您想更新观察者:

    mCountDownTimer = new CountDownTimer(startTime, 1000) {
        //update after each tick
        public void onTick(long millisUntilFinished) {

            long seconds = (millisUntilFinished / 1000) % 60;
            long minutes = ((millisUntilFinished / 1000) / 60) % 60;
            long hours = (((millisUntilFinished / 1000) / 60) / 60) % 24;
            long days = (((millisUntilFinished / 1000) / 60) / 60) / 24;
            if(listeners!=null){
                Log.d(TAG, "days:"+days + "hours:"+ hours + "minutes:"+ minutes + "seconds:"+ seconds);
                listeners.onTimeChanged(days, hours, minutes, seconds);
            }
        }

        public void onFinish() {
            if(listeners!=null){
                Log.d(TAG, "timer finished");
                listeners.onTimerFinish();
            }
        }
    }.start();
于 2013-07-29T18:38:25.313 回答
1

我不会尝试进行实际倒计时,因为当应用程序离开时你的线程应该死掉,这看起来真的很复杂。

相反,在某处(sqlite db?文件?)写入开始时间和倒计时运行的持续时间。每当您需要显示它、查询它并执行更新视图所需的过程时,无论视图是否到位。这很容易(对我而言)回答您的所有规范,没有线程负担,并且只使用很少的磁盘空间。另外,您可以毫无问题地保存所有倒计时特定数据,这可能会很有用。

于 2013-07-29T15:57:10.953 回答