【发布时间】:2013-11-26 16:02:06
【问题描述】:
虽然在 Android 中使用 retain Fragments 在配置更改期间保存 AsyncTask,我想这是最好的方法,但我对 UI Thread 的消息队列调用顺序产生了一些疑问。
例如: 想象一下这种情况:
- 发生配置更改,用户旋转设备。 AsyncTask 正在运行。
- 片段
onDetach()被调用 - AsyncTask
doInBackground()方法完成 - AsyncTask
onPostExecute()被调用 - 片段
onAttach()被调用
UI线程消息队列也可以这样:
队列顶部-> onDetach() | onPostExecute() | onAttach()
我知道它不能,就我所知,对onPostExecute() 的调用将等到配置更改完成,但它是如何工作的?来自活动、片段生命周期的调用是否连续执行?
【问题讨论】:
-
是的,由于
onPostExecute()在 UI 线程上运行,它会随着 UI 和配置更改连续执行,这些更改也在 UI 线程上运行。我的假设是onDetach()和onAttach()在某种程度上以原子方式运行,因为 ActivityManager 在配置更改期间可能不会屈服于其他线程,但这是您必须深入研究 Android 源代码才能确认的事情。 -
是的,查看 android 源代码可能是了解其工作原理的最佳方式。
-
@323go 进一步澄清,在这种情况下,Android 永远不必“屈服于其他线程”。 Android UI 工具包的单线程特性保证了原子性(即事件在一个集中的消息队列中按顺序执行)。