1

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

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

异常告诉我已经抛出该对象的循环器......

然后我尝试用 Looper.myLooper() 替换 getMainLooper() 并且它起作用了......

但我不明白为什么=)

事实上,我不明白这两件事之间的区别。我认为在我的项目中使用 getMainLooper() 的地方,它是应用程序真正的主循环器的最佳位置,但我得到了我得到的......

请解释。

感谢您的关注

4

1 回答 1

10

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

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

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

于 2011-07-20T17:45:13.000 回答