Заказ диспетчера очереди сообщений для 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() .

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

Intereting Posts
Макет, как и карты в Android Android OpenGL ES 2.0: возможен ли синтаксис «switch-case» в шейдере фрагмента GLSL на Samsung Galaxy S2? Java.lang.NoClassDefFoundError: javax.microedition.io.Connector Разработка Android в IntelliJ IDEA заставляет компьютер замораживать Использование SimpleCursorAdapter.ViewBinder для изменения цвета TextView Как использовать проект Java, который требует уровня соответствия 1.7 на пути создания проекта Android? Какая польза от 0xff -colors в Android? Dfference между использованием URLCOnnection Object и Httppost в клиенте android Как обновить базу данных Sqlite только для одного столбца, используя предложение WHERE в android Как мы контролируем предпочтение адаптера синхронизации Android? Не удалось найти zipalign в Android sdk / tools Ошибка броска кодов на номера версий в кордове config.xml Как использовать Zxing в android Ошибка проигрывателя Android Media (1, -4) при воспроизведении аудио из папки «Активы» Java.lang.IllegalStateException: TimerTask уже запланирован: Рациональное использование Timer и TimerTask в Android