Android:getMainLooper()和Looper.myLooper()之间的区别

时间:2011-07-20 17:34:32

标签: android looper

我现在正试图复活一个项目。 getMainLooper()...

上有一个例外

我认为MainLooper初始化可能存在问题,并在此之前添加了Looper.prepareMainLoop()。

异常告诉我,该对象已经有一个looper被抛出......

然后我尝试用Looper.myLooper()替换getMainLooper()并且它有效...

但我不明白为什么=)

事实上,我并没有区分这两件事。我认为在我的项目中使用getMainLooper()的地方,它是应用程序的真正主要活跃者的最佳位置,但我得到了我得到的东西..

请解释。

感谢您的关注

1 个答案:

答案 0 :(得分:10)

不同之处在于Looper.prepareMainLooper()在主UI线程中准备looper。 Android应用程序通常不会调用此函数。由于主要线程在第一次活动之前很久就准备好了looper,因此启动了服务,提供者或广播接收者。

但是Looper.prepare()在当前线程中准备Looper。调用此函数后,线程可以调用Looper.loop()开始处理Handler s的消息。

所以,在你的情况下,你有两个线程--X和Y.X线程是主要的UI线程,它已经由Android准备好了looper。当你在Y线程中并且你正在调用Looper.prepareMainLooper()时,你试图在X线程(主线程)中准备looper。这失败了,因为X的looper已经准备好了。但是当你在Y线程中调用Looper.prepare()时,你实际上是在Y线程中准备looper,因此准备调用Looper.loop()