Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 倒计时:“倒计时”;Can';t在未调用Looper.prepare()的线程内创建处理程序;_Android_Multithreading_Countdowntimer_Looper - Fatal编程技术网

Android 倒计时:“倒计时”;Can';t在未调用Looper.prepare()的线程内创建处理程序;

Android 倒计时:“倒计时”;Can';t在未调用Looper.prepare()的线程内创建处理程序;,android,multithreading,countdowntimer,looper,Android,Multithreading,Countdowntimer,Looper,我知道以前有人问过“无法在未调用Looper.prepare()的线程内创建处理程序”的一般问题,但我很难理解它在这种情况下是如何应用的 我试图在一个非UI线程中构造一个新的倒计时器,我想这就是导致这个错误的原因,但我真的不明白为什么需要在主线程中使用计时器。从我看到的情况来看,它似乎有一个回调处理程序,需要在具有循环器的线程中运行,而非UI线程默认情况下没有循环器。看起来我的选择是:1)让这个非UI线程有一个循环器,或者2)在我的UI线程上创建一些奇怪的方法来构造这个计时器,这两个方法对我来说

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

我试图在一个非UI线程中构造一个新的倒计时器,我想这就是导致这个错误的原因,但我真的不明白为什么需要在主线程中使用计时器。从我看到的情况来看,它似乎有一个回调处理程序,需要在具有循环器的线程中运行,而非UI线程默认情况下没有循环器。看起来我的选择是:1)让这个非UI线程有一个循环器,或者2)在我的UI线程上创建一些奇怪的方法来构造这个计时器,这两个方法对我来说都很愚蠢。有人能帮我理解其中的含义吗


还有,有人知道有什么有用的链接可以帮助我们了解Looper和MessageQueue吗?我不能很好地理解它们,我相信我已经表现出来了。谢谢大家!

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


使用asynctask并在
onProgressUpdate

中更新UI必须在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(...);
     }
});

但是请注意,上面的代码段如何需要引用您的活动和类成员变量mTimer

,我认为情况并非如此。我已经注释掉了anonymous类中的所有代码,所以它在构造函数中调用super,但是我仍然得到相同的错误。是不是因为倒数计时器有一个回调方法,当它完成时,这需要由循环器“触发”?这就是我希望澄清的困惑。我们甚至可以把问题从我的特定问题中抽象出来——我只是想弄清楚它是如何结合在一起的。谢谢。哦,我想我误解了你的问题。我可以问一下为什么在非UI线程中使用
CountdownTimer
?我认为
CountdownTimer
的要点是能够轻松地更新UI线程。看起来
onTick()
onFinish()
应该在UI线程上运行。为什么不用一个普通的java定时器呢?我想我可以用一个普通的定时器。不管怎样,如果我不进行任何UI更新,为什么CountDownTimer会在构造函数中爆炸?因为每次调用onTick()时,它都希望位于UI线程上,onTick()为什么需要UI线程?这是我不明白的。我就是不明白为什么这个处理程序需要访问UI线程。所有需要中断的异步方法都通过UI线程工作吗?感谢您的帮助。不需要在UI线程上创建倒计时。倒计时程序创建一个处理程序,该处理程序需要Looper.Yep提供的消息循环。在Android API 23上测试。如果我在后台线程上创建它,就会得到臭名昭著的
Looper.prepare
异常。不过,我的自定义类会在剩余时间内更新TextView。