AsyncTask: Beware of Curves Ahead
Somebody tweeted yesterday a link to
this code change to
This suggests that the core Android team made good on a veiled threat
of changing the
AsyncTask behavior to only execute one task at a time.
That being said, in some tests this morning, I cannot seem to get the
lightly-documented behavior. If I fire up several
AsyncTask instances, they
still all seem to run in parallel on 4.0.3 in the emulator and on
a Nexus S. Perhaps somebody on the core android team has a different
definition of “serialized” than I do – I was expecting behavior more
IntentService, where each command sent to it will be processed one
at a time, not in parallel.
It is very possible that parts of this patch did not make it into the product
as yet. If nothing else, the JavaDocs for
execute() do not match
the JavaDoc comment on
execute() as shown in the patch. And, there
was no note of an
AsyncTask behavior change in the API Level 14 or 15
SDK release notes, and I would hope that a change of this magnitude
would not be swept under the rug.
That being said, I would keep a very close eye on
AsyncTask for the
foreseeable future. If you are definitely relying on
multiple threads in parallel, you should consider starting to use
executeOnExecutor() instead of
execute(), perhaps using the stock
THREAD_POOL_EXECUTOR, or perhaps using your own
And, in the meantime, I get to figure out why the R17 tools seriously screwed up Eclipse’s ability to build projects…
Want an expert opinion on your Android app architecture decisions? Perhaps Mark Murphy can help!