虽然在 Android 中使用 retain Fragments 在配置更改期间保存 AsyncTask,我想这是最好的方法,但我对 UI Thread 的消息队列调用顺序产生了一些疑问。
例如: 想象一下这种情况:
- 发生配置更改,用户旋转设备。 AsyncTask 正在运行。
- fragment
onDetach()
被调用 - AsyncTask
doInBackground()
方法完成 - AsyncTask
onPostExecute()
被调用 - fragment
onAttach()
被调用
UI线程消息队列也可以这样:
Queue top -> onDetach() | onPostExecute() | onAttach()
我知道它不能,据我所知,对 onPostExecute()
的调用将等到配置更改完成,但它是如何工作的?来自 Activity 、 fragment 生命周期的调用是否连续执行?
最佳答案
在 Fragment#onDetach()
和 Fragment#onAttach()
之间不能调用 onPostExecute()
配置更改。这种说法背后的原因有三个:
配置更改在主线程消息队列中的单个消息内处理。
只要
doInBackground()
方法返回,AsyncTask
就会安排onPostExecute()
方法在主线程通过向主线程的消息队列发布消息。配置更改的消息将包含将调用
Activity
和Fragment
生命周期方法的代码(例如onDetach()
和onAttach()
)。AsyncTask
的消息将包含调用onPostExecute()
方法的代码。由于主线程按顺序处理其消息队列中的消息,两条消息不可能同时执行,因此在调用onPostExecute()
之间永远不能调用>onDetach()
和onAttach()
。
阅读我在 this thread 中对 Doug Stevenson 的回复以获得更详细的解释(包括证明该声明的源代码的链接)。
关于Android UI 线程消息队列调度顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19964180/