我现在正试图复活一个项目。 getMainLooper()...
上有一个例外我认为MainLooper初始化可能存在问题,并在此之前添加了Looper.prepareMainLoop()。
异常告诉我,该对象已经有一个looper被抛出......
然后我尝试用Looper.myLooper()替换getMainLooper()并且它有效...
但我不明白为什么=)
事实上,我并没有区分这两件事。我认为在我的项目中使用getMainLooper()的地方,它是应用程序的真正主要活跃者的最佳位置,但我得到了我得到的东西..
请解释。
感谢您的关注
答案 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()
。