AsyncTask一些注意的問題

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)存泄露。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容