0

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

在此处输入图像描述

然后执行的控制转移到View类并调用performClick() 在此处输入图像描述

之后,它会进入Handler类并调用dispatchMessage(Message msg) 在此处输入图像描述 ,最后,它会多次调用loop()Looper类,然后才能恢复正常流程 在此处输入图像描述 那么有人可以在这里帮助我了解幕后发生的事情以及为什么这个 loop() 被多次调用吗?

4

1 回答 1

2

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

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

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

使 android 与大多数桌面/控制台(如 java 应用程序)不同的是Looper类。该类有一个Looper.loop()在 的 main 方法中调用的ActivityThread方法,并且由于 a for(;;){}(双分号表示无限循环),它运行了一个无限循环。这个循环将无限期地继续运行,除非quit()被外部调用。循环方法在message.next()每次完成消息时调用,以检索新消息。

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

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

于 2017-12-10T18:07:46.137 回答