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

Ser*_*rra 61 android android-asynctask

使用Android中的retain Fragments在配置更改期间保存AsyncTask时,我认为这是最好的方法,我脑海中出现了一些关于UI Thread的Message Queue调用顺序的疑问.

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

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

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

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

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

Ale*_*ood 119

这是不可能的onPostExecute()之间被称为中Fragment#onDetach()Fragment#onAttach()一个结构变更时.这种说法背后的原因有三个:

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

  2. 一旦该doInBackground()方法返回,就通过将消息发布到主线程的消息队列来AsyncTask调度onPostExecute()要在主线程上调用的方法.

  3. 配置改变的消息将包含将调用的代码ActivityFragment生命周期方法(如onDetach()onAttach()).该AsyncTask消息将包含将调用该onPostExecute()方法的代码.由于主线程在它的消息队列顺序处理的消息,这是不可能的,以同时执行的两条消息,因此onPostExecute()该呼叫之间可以永远不会被调用中onDetach()onAttach().

请阅读我在此主题中对Doug Stevenson的回复,以获得更详细的解释(包括证明声明的源代码的链接).

  • @DavidT.主UI线程在同一消息中调用`onDetach`和`onAttach`. (5认同)
  • 这不仅仅是当前的实现细节,因此我们依赖于白盒行为吗?例如,将来这种行为不会改变吗? (3认同)