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

多個AsyncTask任務(wù)是串行還是并行?
從Android 1.6到2.3(Gingerbread) AsyncTask是并行的,即上面我們提到的有5個核心線程的線程池(ThreadPoolExecutor)負責(zé)調(diào)度任務(wù)。從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();
從它的說明也可以看出是串行的。如需要并行,可以通過設(shè)置executeOnExecutor(Executor)來實現(xiàn)多個AsyncTask并行。
public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,
Params... params) {
AsyncTask容易引發(fā)的Activity內(nèi)存泄露
如果AsyncTask被聲明為Activity的非靜態(tài)的內(nèi)部類,那么AsyncTask會保留一個對創(chuàng)建了AsyncTask的Activity的引用。如果Activity已經(jīng)被銷毀,AsyncTask的后臺線程還在執(zhí)行,它將繼續(xù)在內(nèi)存里保留這個引用,導(dǎo)致Activity無法被回收,引起內(nèi)存泄露。