Android UI线程消息队列调度顺序
虽然在Android中使用retain Fragments来保存configuration更改期间的AsyncTask,但我认为这是最好的方法,但在UI Thread的Message Queue调用顺序中却出现了一些疑问。
例如:想象一下这个场景:
- 发生configuration更改,用户旋转设备。 AsyncTask正在运行。
- 片段
onDetach()
被调用 - AsyncTask
doInBackground()
方法结束 - 调用AsyncTask
onPostExecute()
-
onAttach()
上的片段被调用
所以UI线程消息队列可以这样:
队列顶部 – > onDetach()| onPostExecute()| onAttach()
我知道它不能,调用onPostExecute()
将等待,直到configuration更改完成,据我所知,但这是如何工作的? “活动”,“碎片”生命周期的调用是否连续执行?
在configuration更改期间, onPostExecute()
不能在Fragment#onDetach()
和Fragment#onAttach()
之间调用。 这个说法背后的推理是三重的:
-
configuration更改在主线程的消息队列中的单个消息内处理。
-
只要
doInBackground()
方法返回,AsyncTask
onPostExecute()
通过在主线程的消息队列中发布消息来调度onPostExecute()
方法。 -
configuration更改的消息将包含将调用
Activity
和Fragment
生命周期方法(如onDetach()
和onAttach()
)的代码。AsyncTask
的消息将包含将调用onPostExecute()
方法的代码。 由于主线程按顺序处理消息队列中的消息,因此两个消息不可能同时被执行,因此在调用onDetach()
和onAttach()
之间永远不能调用onAttach()
。
请阅读我对Doug Stevenson的回复,以获得更详细的解释(包括certificate索赔的源代码的链接)。