【问题标题】:How do I use Android's CountDownTimer?如何使用 Android 的 CountDownTimer?
【发布时间】:2010-12-01 18:09:55
【问题描述】:

如何使用 Android 的 CountDownTimer?

我基本上希望有以下场景:

boolean 3_s_passed = false;
// setup counter to change 3_s_passed=true when it finishes
counter.start();
while(true){

if(3_s_passed || user_is_Done) break;
// do some stuff which may set user_is_Done to true

}

所以要么过了 3 秒,要么用户完成,我就退出了循环。 while-loop 代码会在计数器完成之前运行吗?我对 CountDownTimer 的理解是否正确?

感谢您的帮助

【问题讨论】:

    标签: android counter


    【解决方案1】:

    您可以为此使用处理程序。制作一个Runnable,让任务在 3 秒后或用户执行任务时完成。将其发布 3 秒,如果用户执行任何操作,则删除回调。下面相同的代码显示了如何正确使用Handler,但没有循环以允许用户进行操作,您必须自己弄清楚:)

    Runnable action = new Runnable(){
    
        public void run(){
           //...
        }
    };
    
    mHandler.postDelayed(action, 3000);
    if(userDone){
      mHandler.removeCallbacks(action);
      mHandler.post(action);
    }
    

    【讨论】:

    • 嗯。如果我理解正确,mHandler 会在 3 秒时向消息队列添加操作。但是,如果 userDone,mHandler 会取消该操作请求,并告诉 Android 现在将该操作添加到消息队列中。那是对的吗?还想知道如果 userDone=true,是否可以保证在 if 语句之后的代码之前运行操作?队列的想法总是让我担心时间错误和竞争条件。
    • 您对处理程序的理解是正确的,但是您的第二个问题不是很清楚。如果您调用 mHandler.post(action) 它肯定会执行您所要求的可运行它...
    • 感谢您的回复。澄清第二部分:假设我在 if 语句之后有代码,并且 mHandler.post(action) 被执行。是否可以保证在我的代码之前执行操作?
    • 啊,是的,处理程序发布到创建它的任何线程,因此如果您在运行 if 语句的同一线程中创建处理程序,它将执行action 之前的所有代码移动到下一行。
    【解决方案2】:

    不要使用这个类,它在取消方法中包含竞争。 https://code.google.com/p/android/issues/detail?id=58668

    如果 onTick 和 cancel 之间发生竞争,cancel 不起作用。

    最好从头开始实现它,不要进行比赛。 在其他情况下,您将遇到问题,直到官方修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2022-08-16
      • 2012-11-08
      • 1970-01-01
      相关资源
      最近更新 更多