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

Why loop() in Looper class gets called multiple times

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

然后执行控制转移到查看 class并调用performClick()

然后它转到 Handler class 并调用 dispatchMessage(Message msg) 最后,它调用 Looper class 的 loop() 多次,然后返回正常流程。 那么有人可以在这里帮助我了解幕后发生的事情以及为什么多次调用此 loop() 吗?

loop()Looper class 的一部分。当您的进程初始化应用程序时,在您的 android 应用程序的深处,JVM 寻找的第一件事是入口点,在所有 Java 应用程序中,它是主要方法。 android main 方法存在于名为 ActivityThread 的 class 中(检查 activity 线程的 AOSP)。

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

  1. ActivityThread的main方法中的Looper调用了prepareMainLooper()方法。这个。将当前线程初始化为应用程序的主循环程序。也就是说,这是您的主线程收到其 mainthread 名称的地方,这与 运行 时的所有其他线程不同。
  2. 同样在 main 方法中,处理程序负责管理 MessageQueue 接收和处理来自您应用的消息的位置。重要的是要注意 [Messages] 可以作为 Runnable 或其他可执行对象由 MessageQueue 执行。

android 与大多数 desktop/console 等 java 应用程序的不同之处在于 Looper class。这个 class 有一个 Looper.loop() 方法,在 ActivityThread 的主要方法中被调用,并且它 运行 是一个无限循环,这要归功于 for(;;){}(双分号表示无限循环)。除非外部调用 quit(),否则此循环将无限期地继续 运行。循环方法每次完成消息时调用 message.next() 以检索新消息。

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

如果您有兴趣,请查看 AOSP 进行更深入的研究!