AsyncTask: Beware of Curves Ahead

Somebody tweeted yesterday a link to this code change to AsyncTask 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 like 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 AsyncTask using 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 Executor.

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!