Во время работы с сохранением фрагментов в Android для хранения AsyncTask во время изменений конфигурации, которые, я думаю, это лучший подход, некоторые сомнения возникают в моем сознании относительно порядка вызова очереди сообщений в пользовательском интерфейсе.
Пример: Представьте себе этот сценарий:
onDetach()
называется doInBackground()
завершается onPostExecute()
onAttach()
называется Таким образом, очередь сообщений в очереди сообщений UI будет выглядеть так:
Queue top -> onDetach () | OnPostExecute () | onAttach ()
Я знаю, что он не может, вызов onPostExecute()
будет ждать, пока изменение конфигурации не завершится, насколько я знаю, но как это работает? Являются ли вызовы из «Действия», «Жизненные циклы фрагментов» выполняются последовательно?
Невозможно, чтобы onPostExecute()
вызывался между Fragment#onDetach()
и Fragment#onAttach()
во время изменения конфигурации. Причины этого утверждения трижды:
Изменения конфигурации обрабатываются внутри одного сообщения в очереди сообщений основного потока.
Как только метод doInBackground()
вернется, AsyncTask
планирует метод onPostExecute()
который будет вызываться в основном потоке, отправив сообщение в очередь сообщений основного потока.
Сообщение об изменении конфигурации будет содержать код, который будет вызывать методы жизненного цикла Activity
и Fragment
(такие как onDetach()
и onAttach()
). Сообщение AsyncTask
будет содержать код, который будет вызывать метод onPostExecute()
. Поскольку основной поток обрабатывает сообщения в очереди сообщений последовательно, невозможно, чтобы оба сообщения выполнялись одновременно, и поэтому onPostExecute()
никогда не может быть вызван между вызовами onDetach()
и onAttach()
.
Прочтите мой ответ Дугу Стивенсону в этой теме для более подробного объяснения (включая ссылки на исходный код, подтверждающий претензию).