我现在正尝试复活一个项目.
getMainLooper()发生异常…
我认为MainLooper初始化可能存在问题,并在此之前添加了Looper.prepareMainLoop().
异常告诉我,该对象已经存在一个循环播放器…
然后我尝试用Looper.myLooper()替换getMainLooper(),它起作用了…
但是我不明白为什么=)
实际上,我没有得到这两件事之间的区别.我认为在我的项目中使用getMainLooper()的地方,这是应用程序真正的主循环程序的最佳位置,但是我得到了我想要的.
请解释.
感谢您的关注
解决方法:
区别在于Looper.prepareMainLooper()在主UI线程中准备循环程序. Android应用程序通常不调用此功能.由于主线程在第一次活动,服务,提供者或广播接收者启动之前就已经准备好了其循环程序.
但是Looper.prepare()在当前线程中准备Looper.调用此函数后,线程可以调用Looper.loop()以开始使用Handlers处理消息.
因此,在您的情况下,您有两个线程-X和Y.X线程是主要的UI线程,它的弯针已由Android准备.在Y线程中并调用Looper.prepareMainLooper()时,您将尝试在X线程(主线程)中准备Looper.之所以失败,是因为X的弯针已经准备好了.但是,当您在Y线程中调用Looper.prepare()时,您实际上是在Y线程中准备Looper,因此可以调用Looper.loop().