AsyncTask and Screen Rotation
In The Busy Coder’s Guide to Android Development Version 3.1,
I added a section on how to handle orientation changes and
AsyncTask. The sample project
shows an AsyncTask implementation as a static inner class.
The task is returned in onRetainNonConfigurationInstance(), and
the hosting Activity is responsible for making sure the
AsyncTask knew the right Activity instance to use, before
and after the orientation change.
And the code works.
But, until today, I didn’t quite know why.
It turns out that Android will not process messages off of the
message queue between onRetainNonConfigurationInstance() of the
old Activity and onCreate() of the new Activity. Hence,
even though the actual background thread of the AsyncTask may
continue to chug along during the orientation change, you do
not have to worry about onProgressUpdate() or onPostExecute()
being called during the transition period. And, if you use the
pattern described in the book and demonstrated in the above
code sample — detaching from the old activity in
onRetainNonConfigurationInstance() and attaching to the new
one in onCreate(), your AsyncTask will always have the right
Activity to work from on the main application thread.
This does emphasize, though, that you want doInBackground()
of your AsyncTask to be completely decoupled from the
Activity. If you only touch your Activity on the main application
thread, your AsyncTask can survive the orientation change
intact.
As Ms. Hackborn points out, this is not only for orientation changes. It used to be that the only likely configuration change “on the fly” was an orientation change. But now we have car and desk docks that trigger configuration changes, etc.

