It seems that you can start AsyncTask from somewhere else than the main Thread but the postExecute is really executed on the main thread.
Here is my test, tell me if it seems logical to you :
public class AsyncLoader extends AsyncTask<Context, String, Boolean> {
private ConnectivityManager cm;
private ArrayList<Contact> nameList;
private Context ctx;
private static int i = 0;
@Override
protected Boolean doInBackground(Context... params) {
ctx = params[0];
cm = (ConnectivityManager) params[0].getSystemService(Activity.CONNECTIVITY_SERVICE);
if (i < 3) {
i++;
new AsyncLoader().execute(ctx);
System.out.println("Thread name (from doInBackground) : " + Thread.currentThread().getName());
System.out.println("compteur async " + i);
}
if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isAvailable()) {
nameList = (ArrayList<Contact>) ContactLoaderXml.loadContactsData(); //this is a loading from the web + sax parser
return true;
} else {
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
System.out.println("Thread name (from postexecute) : " + Thread.currentThread().getName());
}
}
Here is the stacktrace after the tasks :
I/System.out( 641): Thread name (from doInBackground) : AsyncTask #1
I/System.out( 641): compteur async 1
I/System.out( 641): Thread name (from doInBackground) : AsyncTask #2
I/System.out( 641): compteur async 2
I/System.out( 641): Thread name (from doInBackground) : AsyncTask #3
I/System.out( 641): compteur async 3
I/System.out( 641): Thread name (from postexecute) : main
I/System.out( 641): Thread name (from postexecute) : main
I/System.out( 641): Thread name (from postexecute) : main
I/System.out( 641): Thread name (from postexecute) : main
I don't know why the post execute is done 4 times though...