我知道“无法在未调用Looper.prepare()的线程内创建处理程序”的一般问题之前已被问过,但我很难理解它在这种情况下是如何应用的。
我正在尝试在非UI线程中构造一个新的CountDownTimer,我猜这是导致此错误的原因,但我真的不明白为什么需要在主线程中使用定时器。从我所看到的,看起来它有一个回调处理程序需要在一个具有looper的线程中运行,非UI线程默认情况下没有。看来我的选择是:1)让这个非UI线程有一个Looper或者2)在我的UI线程上创建一个可以构造这个计时器的奇怪方法,这两个对我来说都很傻。有人能帮我理解其含义吗?
此外,有没有人知道任何有用的链接,揭示了Looper和MessageQueue?我没有把握好,因为我相信我已经表现出来了。谢谢!
答案 0 :(得分:3)
计时器不需要在UI线程中。但我的猜测是你正在更新UI以显示该线程中的倒计时数。俞不能那样做。
使用asynctask并更新onProgressUpdate
答案 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
的引用