7

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

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

另外,有没有人知道任何有用的链接可以阐明 Looper 和 MessageQueue?我没有很好地掌握它们,我确信我已经证明了这一点。谢谢!

4

2 回答 2

4

必须在 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

于 2014-09-09T22:17:01.603 回答
2

计时器不需要在 UI 线程中。但我的猜测是您正在更新 UI 以显示该线程中的倒计时。禹做不到。

使用异步任务并更新 UIonProgressUpdate

于 2010-10-24T02:58:41.877 回答