CountDownTimer:“无法在未调用Looper.prepare()的线程内创建处理程序”

时间:2010-10-23 23:20:06

标签: android multithreading countdowntimer looper

我知道“无法在未调用Looper.prepare()的线程内创建处理程序”的一般问题之前已被问过,但我很难理解它在这种情况下是如何应用的。

我正在尝试在非UI线程中构造一个新的CountDownTimer,我猜这是导致此错误的原因,但我真的不明白为什么需要在主线程中使用定时器。从我所看到的,看起来它有一个回调处理程序需要在一个具有looper的线程中运行,非UI线程默认情况下没有。看来我的选择是:1)让这个非UI线程有一个Looper或者2)在我的UI线程上创建一个可以构造这个计时器的奇怪方法,这两个对我来说都很傻。有人能帮我理解其含义吗?

此外,有没有人知道任何有用的链接,揭示了Looper和MessageQueue?我没有把握好,因为我相信我已经表现出来了。谢谢!

2 个答案:

答案 0 :(得分:3)

计时器不需要在UI线程中。但我的猜测是你正在更新UI以显示该线程中的倒计时数。俞不能那样做。

使用asynctask并更新onProgressUpdate

中的UI

答案 1 :(得分:1)

必须在UI线程上创建CountDownTimer的实例。

如果您有自定义类对象:

public class MyTimer extends CountDownTimer{
    public MyTimer(...){
         super(duration,interval);
    }
    //... other code ...//
}

必须在UI线程上运行对象的构造

MyTimer mTimer = new MyTimer(...);   //can throw RuntimeException
                                    // with Looper.prepare() issue if
                                    // caller isn't UI thread

如果多个线程正在创建并销毁计时器,请确保通过执行以下操作在UI线程上创建它:

MyActivity.runOnUiThread( new Runnable(){
     public void run(){
          mTimer = new MyTimer(...);
     }
});

但请注意上述代码段如何需要对您的Activity和类成员变量mTimer

的引用