AsyncTasks are executed serially on a single background thread (from API 11).
A little test:
private static class AsyncTaskX extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
for (int i = 0; i < 10; i++){
Log.i("test order", "ping X "+ i);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
}
private static class AsyncTaskY extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
for (int i = 0; i < 10; i++){
Log.i("order", "ping Y" + i);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
}
Logs:
test order: ping X 0
test order: ping X 1
test order: ping X 2
test order: ping X 3
test order: ping X 4
test order: ping X 5
test order: ping X 6
test order: ping X 7
test order: ping X 8
test order: ping X 9
order: ping Y0
order: ping Y1
order: ping Y2
order: ping Y3
order: ping Y4
order: ping Y5
order: ping Y6
order: ping Y7
order: ping Y8
order: ping Y9
So long running worker can block others.
task.execute().get() will return before the onPostExecute and you will block UI thread.
Check general information about processes and threads and some gotchas.
Time of execution also matters, because AsyncTask should only be used for tasks/operations that take quite few seconds.