gpt4 book ai didi

Android UI 线程消息队列调度顺序

转载 作者:IT老高 更新时间:2023-10-28 13:24:15 25 4
gpt4 key购买 nike

虽然在 Android 中使用 retain Fragments 在配置更改期间保存 AsyncTask,我想这是最好的方法,但我对 UI Thread 的消息队列调用顺序产生了一些疑问。

例如:想象一下这种情况:

  1. 发生配置更改,用户旋转设备。 AsyncTask 正在运行。
  2. fragment onDetach()被调用
  3. AsyncTask doInBackground() 方法完成
  4. AsyncTask onPostExecute()被调用
  5. fragment onAttach()被调用

UI线程消息队列也可以这样:

Queue top -> onDetach() | onPostExecute() | onAttach()

我知道它不能,据我所知,对 onPostExecute() 的调用将等到配置更改完成,但它是如何工作的?来自 Activity 、 fragment 生命周期的调用是否连续执行?

最佳答案

Fragment#onDetach()Fragment#onAttach() 之间不能调用 onPostExecute()配置更改。这种说法背后的原因有三个:

  1. 配置更改在主线程消息队列中的单个消息内处理。

  2. 只要 doInBackground() 方法返回,AsyncTask 就会安排 onPostExecute() 方法在主线程通过向主线程的消息队列发布消息。

  3. 配置更改的消息将包含将调用 ActivityFragment 生命周期方法的代码(例如 onDetach()onAttach())。 AsyncTask 的消息将包含调用 onPostExecute() 方法的代码。由于主线程按顺序处理其消息队列中的消息,两条消息不可能同时执行,因此在调用 onPostExecute() 之间永远不能调用 >onDetach()onAttach()

阅读我在 this thread 中对 Doug Stevenson 的回复以获得更详细的解释(包括证明该声明的源代码的链接)。

关于Android UI 线程消息队列调度顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19964180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com