AnsycTask執(zhí)行任務時,內部會創(chuàng)建一個進程作用域的線程池來管理要運行的任務,也就就是說當你調用了AsyncTask.execute()后,AsyncTask會把任務交給線程池,由線程池來管理創(chuàng)建Thread和運行Therad。最后和UI打交道就交給Handler去處理了。
線程池可以同時執(zhí)行多少個TASK?
Android 3.0之前(1.6之前的版本不再關注)規(guī)定線程池的核心線程數為5個(corePoolSize),線程池總大小為128(maximumPoolSize),還有一個緩沖隊列(sWorkQueue,緩沖隊列可以放10個任務),當我們嘗試去添加第139個任務時,程序就會崩潰。當線程池中的數量大于corePoolSize,緩沖隊列已滿,并且線程池中的數量小于maximumPoolSize,將會創(chuàng)建新的線程來處理被添加的任務。如下圖會出現第16個Task比第6-15個Task先執(zhí)行的情況。

多個AsyncTask任務是串行還是并行?
從Android 1.6到2.3(Gingerbread) AsyncTask是并行的,即上面我們提到的有5個核心線程的線程池(ThreadPoolExecutor)負責調度任務。從Android 3.0開始,Android團隊又把AsyncTask改成了串行,默認的Executor被指定為SERIAL_EXECUTOR。
/**
* An {@link Executor} that executes tasks one at a time in serial
* order. This serialization is global to a particular process.
*/
public static final Executor SERIAL_EXECUTOR = new SerialExecutor();
從它的說明也可以看出是串行的。如需要并行,可以通過設置executeOnExecutor(Executor)來實現多個AsyncTask并行。
public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,
Params... params) {
AsyncTask容易引發(fā)的Activity內存泄露
如果AsyncTask被聲明為Activity的非靜態(tài)的內部類,那么AsyncTask會保留一個對創(chuàng)建了AsyncTask的Activity的引用。如果Activity已經被銷毀,AsyncTask的后臺線程還在執(zhí)行,它將繼續(xù)在內存里保留這個引用,導致Activity無法被回收,引起內存泄露。