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

虽然在Android中使用retain Fragments来保存configuration更改期间的AsyncTask,但我认为这是最好的方法,但在UI Thread的Message Queue调用顺序中却出现了一些疑问。

例如:想象一下这个场景:

  1. 发生configuration更改,用户旋转设备。 AsyncTask正在运行。
  2. 片段onDetach()被调用
  3. AsyncTask doInBackground()方法结束
  4. 调用AsyncTask onPostExecute()
  5. onAttach()上的片段被调用

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

队列顶部 – > onDetach()| onPostExecute()| onAttach()

我知道它不能,调用onPostExecute()将等待,直到configuration更改完成,据我所知,但这是如何工作的? “活动”,“碎片”生命周期的调用是否连续执行?

在configuration更改期间, onPostExecute()不能在Fragment#onDetach()Fragment#onAttach()之间调用。 这个说法背后的推理是三重的:

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

  2. 只要doInBackground()方法返回, AsyncTask onPostExecute()通过在主线程的消息队列中发布消息来调度onPostExecute()方法。

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

请阅读我对Doug Stevenson的回复,以获得更详细的解释(包括certificate索赔的源代码的链接)。