這是 Android 性能模式第五季的第四集闷旧,從本期開(kāi)始我會(huì)修改一下之前的規(guī)則窃这,不再一句英文一句中文對(duì)應(yīng),而是先看完整個(gè)視頻槽华,邊看邊翻譯壹蔓,從而整理出重要的知識(shí)點(diǎn)。
盡量縮短別人看文章花費(fèi)的時(shí)間猫态,而大量工作我做就好了佣蓉,就像我們寫(xiě)代碼一樣煮纵, 封裝細(xì)節(jié)后直接提供對(duì)方使用。
本期視頻地址:
AsyncTask 讓我們又愛(ài)又恨(不過(guò)現(xiàn)在好像很少有人還會(huì)用它了吧)偏螺,不過(guò)作為 Android 提供的工具類(lèi),它確實(shí)提供了一些簡(jiǎn)單的使用方法匆光,但如果如果使用不當(dāng)套像,可能一不小心會(huì)傷害我們 App 的性能,比如內(nèi)存泄漏终息。
為什么會(huì)有 AsyncTask夺巩?我們都會(huì)遇到類(lèi)似的場(chǎng)景,比如我解碼圖片周崭,這確實(shí)會(huì)花費(fèi)一些時(shí)間柳譬,所以我們會(huì)選擇在后臺(tái)線(xiàn)程進(jìn)行,然后任務(wù)結(jié)束后在主線(xiàn)程更新 UI续镇,如果有很多這種場(chǎng)景美澳,那么我們不用每次都寫(xiě)一遍上面的代碼,我們提出公共部分寫(xiě)在一起就可以了摸航,所以 AsyncTask 就誕生了(不過(guò)一個(gè) AsyncTask 實(shí)例只能執(zhí)行一次)制跟。
AsyncTask 為我們提供了一些簡(jiǎn)單易用的方法,比如當(dāng)我們使用的它時(shí)候酱虎,最常用的三個(gè)方法就是雨膨,下面圖中的方法,因?yàn)檫@就已經(jīng)完全可以讓我們完成一個(gè)基本的任務(wù)读串,我之前也寫(xiě)過(guò)關(guān)于 AsyncTask 的學(xué)習(xí)筆記聊记,地址如下:
雖然我們可以通過(guò)重寫(xiě)上面三個(gè)方法完成一個(gè)簡(jiǎn)單的 AsyncTask 但你還是需要小心,因?yàn)橛行┘?xì)微的問(wèn)題你需要注意恢暖,不然我可能會(huì)比較頭疼排监。
接下來(lái),會(huì)從三個(gè)方面說(shuō)一下會(huì)有哪些小問(wèn)題需要注意杰捂。
首先社露,我們需要注意 3.2 之后所有 AsyncTask 的任務(wù)都默認(rèn)順序執(zhí)行,如果你同時(shí)開(kāi)始了20個(gè)任務(wù)琼娘,那么 AsyncTask 會(huì)按照順序一個(gè)個(gè)執(zhí)行任務(wù)峭弟。
不過(guò)我們可以通過(guò)通過(guò) executeOnExecutor() 指定執(zhí)行任務(wù)時(shí)的線(xiàn)程池,從而實(shí)現(xiàn)所有任務(wù)并行執(zhí)行脱拼,下過(guò)如下圖:
第二問(wèn)題是 cancel()瞒瘸, 看上去它的作用好像是取消一個(gè)任務(wù),但是實(shí)際上要配合 isCancelled() 使用熄浓,我們通過(guò) AsyncTask 對(duì)象調(diào)用 cancel()情臭,并在 doInBackground() 中使用 isCancelled()省撑,代碼如下:
So,我們是通過(guò) isCancelled() 判斷是否退出俯在,從而決定是否停止任務(wù)竟秫,不過(guò)當(dāng)我們?nèi)∠蝿?wù)后,我們?cè)谥骶€(xiàn)程回調(diào) onCancelled() 而不是 onPostExecute()跷乐。
最后一點(diǎn)肥败,也是最關(guān)鍵的一點(diǎn),就是當(dāng)我們 AsyncTask 作為普通內(nèi)部類(lèi)使用時(shí)愕提,從而引起內(nèi)存泄漏的問(wèn)題馒稍。因?yàn)閮?nèi)部類(lèi)會(huì)隱式的持有外部 Activity 的引用,從而使得 Activity 無(wú)法被正城城龋回收纽谒,直到 AsyncTask 執(zhí)行完任務(wù)。
在視頻結(jié)尾處如输,又介紹到了這些類(lèi)鼓黔,Android 確實(shí)給我們提供了一些不錯(cuò)的工具類(lèi),當(dāng)我們?cè)谑褂玫倪^(guò)程中更應(yīng)該去考慮不见,它們能幫我解決什么問(wèn)題请祖,又會(huì)帶來(lái)問(wèn)題或者隱患,所以不只是使用它們脖祈,而是應(yīng)該搞懂它們的原理肆捕,這樣才能更好地為我們所有。
如果有機(jī)會(huì)你其實(shí)你也可以去看看官方的視頻盖高,挺有趣的慎陵,不是么?