Заказ диспетчера очереди сообщений для Android UI

Во время работы с сохранением фрагментов в Android для хранения AsyncTask во время изменений конфигурации, которые, я думаю, это лучший подход, некоторые сомнения возникают в моем сознании относительно порядка вызова очереди сообщений в пользовательском интерфейсе.

Пример: Представьте себе этот сценарий:

  1. При изменении конфигурации пользователь поворачивает устройство. AsyncTask запущен.
  2. Фрагмент onDetach() называется
  3. Метод AsyncTask doInBackground() завершается
  4. Вызывается AsyncTask onPostExecute()
  5. Фрагмент onAttach() называется

Таким образом, очередь сообщений в очереди сообщений UI будет выглядеть так:

Queue top -> onDetach () | OnPostExecute () | onAttach ()

Я знаю, что он не может, вызов onPostExecute() будет ждать, пока изменение конфигурации не завершится, насколько я знаю, но как это работает? Являются ли вызовы из «Действия», «Жизненные циклы фрагментов» выполняются последовательно?

Невозможно, чтобы onPostExecute() вызывался между Fragment#onDetach() и Fragment#onAttach() во время изменения конфигурации. Причины этого утверждения трижды:

  1. Изменения конфигурации обрабатываются внутри одного сообщения в очереди сообщений основного потока.

  2. Как только метод doInBackground() вернется, AsyncTask планирует метод onPostExecute() который будет вызываться в основном потоке, отправив сообщение в очередь сообщений основного потока.

  3. Сообщение об изменении конфигурации будет содержать код, который будет вызывать методы жизненного цикла Activity и Fragment (такие как onDetach() и onAttach() ). Сообщение AsyncTask будет содержать код, который будет вызывать метод onPostExecute() . Поскольку основной поток обрабатывает сообщения в очереди сообщений последовательно, невозможно, чтобы оба сообщения выполнялись одновременно, и поэтому onPostExecute() никогда не может быть вызван между вызовами onDetach() и onAttach() .

Прочтите мой ответ Дугу Стивенсону в этой теме для более подробного объяснения (включая ссылки на исходный код, подтверждающий претензию).