Good AsyncTask Hunting. (Android Performance Patterns Season 5, Ep. 4)

這是 Android 性能模式第五季的第四集,從本期開始我會修改一下之前的規(guī)則,不再一句英文一句中文對應(yīng),而是先看完整個視頻,邊看邊翻譯,從而整理出重要的知識點。

盡量縮短別人看文章花費的時間,而大量工作我做就好了,就像我們寫代碼一樣, 封裝細節(jié)后直接提供對方使用。

本期視頻地址:

https://www.youtube.com/watch?v=jtlRNNhane0

AsyncTask 讓我們又愛又恨(不過現(xiàn)在好像很少有人還會用它了吧),不過作為 Android 提供的工具類,它確實提供了一些簡單的使用方法,但如果如果使用不當(dāng),可能一不小心會傷害我們 App 的性能,比如內(nèi)存泄漏。

為什么會有 AsyncTask?我們都會遇到類似的場景,比如我解碼圖片,這確實會花費一些時間,所以我們會選擇在后臺線程進行,然后任務(wù)結(jié)束后在主線程更新 UI,如果有很多這種場景,那么我們不用每次都寫一遍上面的代碼,我們提出公共部分寫在一起就可以了,所以 AsyncTask 就誕生了(不過一個 AsyncTask 實例只能執(zhí)行一次)。

工作流程.png

AsyncTask 為我們提供了一些簡單易用的方法,比如當(dāng)我們使用的它時候,最常用的三個方法就是,下面圖中的方法,因為這就已經(jīng)完全可以讓我們完成一個基本的任務(wù),我之前也寫過關(guān)于 AsyncTask 的學(xué)習(xí)筆記,地址如下:

http://www.lxweimin.com/p/3a1581cf2cbe

AsyncTask 基本工作流程和方法調(diào)用.png

雖然我們可以通過重寫上面三個方法完成一個簡單的 AsyncTask 但你還是需要小心,因為有些細微的問題你需要注意,不然我可能會比較頭疼。

接下來,會從三個方面說一下會有哪些小問題需要注意。

首先,我們需要注意 3.2 之后所有 AsyncTask 的任務(wù)都默認順序執(zhí)行,如果你同時開始了20個任務(wù),那么 AsyncTask 會按照順序一個個執(zhí)行任務(wù)。

順序執(zhí)行任務(wù).png

不過我們可以通過通過 executeOnExecutor() 指定執(zhí)行任務(wù)時的線程池,從而實現(xiàn)所有任務(wù)并行執(zhí)行,下過如下圖:

并行執(zhí)行.png

第二問題是 cancel(), 看上去它的作用好像是取消一個任務(wù),但是實際上要配合 isCancelled() 使用,我們通過 AsyncTask 對象調(diào)用 cancel(),并在 doInBackground() 中使用 isCancelled(),代碼如下:

取消任務(wù).png

So,我們是通過 isCancelled() 判斷是否退出,從而決定是否停止任務(wù),不過當(dāng)我們?nèi)∠蝿?wù)后,我們在主線程回調(diào) onCancelled() 而不是 onPostExecute()。

最后一點,也是最關(guān)鍵的一點,就是當(dāng)我們 AsyncTask 作為普通內(nèi)部類使用時,從而引起內(nèi)存泄漏的問題。因為內(nèi)部類會隱式的持有外部 Activity 的引用,從而使得 Activity 無法被正常回收,直到 AsyncTask 執(zhí)行完任務(wù)。

內(nèi)部類造成的內(nèi)存泄漏.png

在視頻結(jié)尾處,又介紹到了這些類,Android 確實給我們提供了一些不錯的工具類,當(dāng)我們在使用的過程中更應(yīng)該去考慮,它們能幫我解決什么問題,又會帶來問題或者隱患,所以不只是使用它們,而是應(yīng)該搞懂它們的原理,這樣才能更好地為我們所有。

又提到了這些類.png

如果有機會你其實你也可以去看看官方的視頻,挺有趣的,不是么?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,065評論 25 708
  • Android Handler機制系列文章整體內(nèi)容如下: Android Handler機制1之ThreadAnd...
    隔壁老李頭閱讀 3,258評論 1 15
  • Android開發(fā)者:你真的會用AsyncTask嗎? 導(dǎo)讀.1 在Android應(yīng)用開發(fā)中,我們需要時刻注意保證...
    cxm11閱讀 2,729評論 0 29
  • 當(dāng)某個應(yīng)用組件啟動且該應(yīng)用沒有運行其他任何組件時,Android 系統(tǒng)會使用單個執(zhí)行線程為應(yīng)用啟動新的 Linux...
    小蕓論閱讀 1,744評論 0 12
  • 六十四歲的自己是一個什么樣的生活狀態(tài)呢?你有沒有想過? 我媽媽今年剛好六十四歲,她現(xiàn)在的主要任務(wù)是照看我的小侄女,...
    冬日霞光閱讀 677評論 3 0