AsyncTask一些注意的問題

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無法被回收,引起內存泄露。

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容