Controlling the level of concurrency
So far, we've carefully avoided being too specific about what exactly happens when we invoke AsyncTask's execute
method. We know that doInBackground
will execute off the main thread, but what exactly does that mean?
The original goal of AsyncTask
was to help developers avoid blocking the main thread. In its initial form at API level 3, AsyncTasks were queued and executed serially (that is, one after the other) on a single background thread, guaranteeing that they would complete in the order they were started.
This changed in API level 4 to use a pool of up to 128 threads to execute multiple AsyncTasks concurrently with each other—a level of concurrency of up to 128. At first glance, this seems like a good thing, since a common use case for AsyncTask
is to perform blocking I/O, where the thread spends much of its time idly waiting for data.
However, as we saw in Chapter 1, Building Responsive Android Applications, there are many issues that commonly arise...