Android UI Thread Message Queue dispatch order
Solution 1:
It is not possible for onPostExecute()
to be called in between Fragment#onDetach()
and Fragment#onAttach()
during a configuration change. The reasoning behind this claim is threefold:
Configuration changes are handled inside a single message in the main thread's message queue.
As soon as the
doInBackground()
method returns, theAsyncTask
schedules theonPostExecute()
method to be invoked on the main thread by posting a message to the main thread's message queue.The configuration change's message will contain the code that will invoke the
Activity
andFragment
lifecycle methods (such asonDetach()
andonAttach()
). TheAsyncTask
's message will contain the code that will invoke theonPostExecute()
method. Since the main thread processes messages in its message queue sequentially, it is impossible for the two messages to be executed at the same time, and thereforeonPostExecute()
can never be invoked in between the calls toonDetach()
andonAttach()
.
Read my response to Doug Stevenson in this thread for a more detailed explanation (including links to the source code that prove the claim).