为什么Looper类中的loop()被多次调用

时间:2017-12-10 17:50:06

标签: android debugging android-handler android-looper

我有一段简单的代码可以启动一个意图,但是当我调试它时会通过各种类,并且经常让我想知道为什么每次调用这些类以及它们在恢复正常执行之前执行了哪些任务。

enter image description here

执行控制然后转移到查看类并调用performClick() enter image description here

然后转到处理程序类并调用dispatchMessage(Message msg) enter image description here 最后,在回到正常流程之前,它会多次调用 Looper 类的loop()enter image description here 所以有人可以帮助我在这里了解幕后发生了什么以及为什么这个循环()被多次调用?

1 个答案:

答案 0 :(得分:2)

deinitloop()课程的一部分。当您的进程初始化应用程序时,您的Android应用程序深入,JVM首先寻找的是一个入口点,在所有Java应用程序中都是主要方法。 android main方法存在于一个名为Looper的类中(检查活动线程的AOSP)。

这堂课的美妙之处在于它做了一些事情,

  1. ActivityThread主要方法中的Looper调用ActivityThread方法。这个。将当前线程初始化为应用程序的主要循环程序。即这是您的主线程接收其 mainthread 标识的位置,它与运行时的所有其他线程不同。
  2. 同样在main方法中,处理程序负责管理MessageQueue来自应用程序的消息的接收和处理。请务必注意,MessageQueue可以将[Messages]作为Runnable或其他可执行对象执行。
  3. 使得android与大多数桌面/控制台(如java应用程序)不同的是Looper类。这个类有prepareMainLooper()方法在Looper.loop()的main方法中调用,并且由于ActivityThread而运行无限循环(双分号表示无限循环) 。除非从外部调用for(;;){},否则此循环将继续无限期运行。循环方法每次完成消息时调用quit(),以检索新消息。

    简而言之,如果没有这种无限循环方法,android很难有一种基本的方式来异步处理传入的消息,这是Android事件驱动性质的核心。循环热切地寻求新消息来处理或传递给处理程序。

    如果您有兴趣,请查看AOSP以获得更深入的潜水!