AsyncTask工作原理復(fù)習(xí)總結(jié)

上周閑來無事就去某些大公司面試了一下题翻,試試現(xiàn)在android這塊的水!總結(jié)出結(jié)論就是,稍大點的公司問的基礎(chǔ)的東西還是比較的多酬荞,而規(guī)模較小的公司則是更注重模塊功能點的實現(xiàn)!所以呢瞧哟,你未來職業(yè)的發(fā)展得有個大體的規(guī)劃混巧,大公司呢,就多注意一下基礎(chǔ)知識和整體框架的把握勤揩,而規(guī)模稍小的公司則需要你將某些功能塊挖的深一些咧党!這是我個人的感覺,哈哈陨亡!僅供參考傍衡!

進入正題!

AsyncTask已經(jīng)出來太久了负蠕,以至于我們可以很熟悉的用它蛙埂!那它是怎么工作的呢?之前在學(xué)習(xí)android的時候遮糖,看過它的源碼實現(xiàn)绣的!但是實在太久了,差不多都忘光了欲账!今天早上手上的事情做完后無聊屡江,就又走了一遍,突然感覺看別人的源碼比自己擼代碼還要舒服赛不!

這里寫圖片描述

我們先從實例化AsyncTask開始逐步了解惩嘉!

這里寫圖片描述

OK,我們聊一下這張圖踢故!從WorkerRunnable中我們看到了AsyncTask的一個重要方法doInBackfround()是在這個方法中執(zhí)行的文黎!然后再將WorkerRunnable的引用添加到了FutureTask中執(zhí)行結(jié)果回調(diào)。所以說基本可以確定這是在子線程中的畴椰,當(dāng)然還有一行代碼可以證明:

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

這行代碼什么意思呢臊诊?

這里寫圖片描述

標(biāo)準后臺線程。這讓你的線程低于正常的優(yōu)先級斜脂,這樣會保證用戶界面的響應(yīng)性抓艳。

OK,看到這即可了帚戳!我們不能盲目的鉆到理解代碼的詳細細節(jié)上玷或,不然就出不去了儡首!

AsyncTask實例化完了,我們就改看看他是怎么執(zhí)行的吧偏友!執(zhí)行的話蔬胯,我們通常會調(diào)用它的execute()方法。

這里寫圖片描述

嗯位他,知識簡單的執(zhí)行了一個函數(shù)氛濒,并傳入了兩個參數(shù)!sDefaultExecutor和params鹅髓,第二個參數(shù)舞竿,不用說了,就是我們自己傳入的參數(shù)窿冯,第一個呢骗奖?

這里寫圖片描述

嗯,它是SerialExecutor的實例化對象醒串,實現(xiàn)了Executor执桌,重要的是下面這行代碼:

final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();

SerialExecutor通過ArrayDeque控制管理線程池中的Runnable對象,其原理是隊列芜赌,先進先出形式仰挣!

看看它提供的offer方法:

這里寫圖片描述

很簡單的翻譯吧!在隊未添加一個Runnable元素较鼓。

再看poll方法:


這里寫圖片描述

取出并移除頂部元素

嗯椎木,大概明白了!SerialExecutor是一個線程池博烂,它通過ArrayDeque來控制線程Runnable的執(zhí)行順序香椎!也就是說SerialExecutor是一個排隊的線程池!

接著說executeOnExecutor()禽篱,它將SerialExecutor和params(我們自己設(shè)置的參數(shù))傳過去了畜伐!

這里寫圖片描述

哈哈,是不是看到了執(zhí)行流程了躺率?

Pending(等待)-->Running(運行)-->Finished(結(jié)束)

如果非等待狀態(tài)玛界,那就不好意思了!拋出了異常悼吱!
如果是等待狀態(tài)則執(zhí)行:

mStatus更改為RUNNING狀態(tài)慎框;
onPreExecute();執(zhí)行之前預(yù)備狀態(tài)
mWorker.mParams = params;設(shè)置傳過來的參數(shù)
exec.execute(mFuture);開始執(zhí)行

exec則是我們傳過來的SerialExecutor,而mFuture則是我們在實例化的時候生成的子線容器后添!

回過頭再看SerialExecutor

這里寫圖片描述

在執(zhí)行 r.run()后笨枯,我們怎么獲得執(zhí)行的結(jié)果呢?

這里寫圖片描述

FutureTask執(zhí)行完成后必會調(diào)用

protected void done() 

那就會執(zhí)行postResultIfNotInvoked(get());

接著

這里寫圖片描述

再接著實例化Handler;

這里寫圖片描述

Handler發(fā)送消息進行處理:

這里寫圖片描述

這個主意的是馅精,在super(Looper.getMainLooper());執(zhí)行后严嗜,又回到到了主線程!而在執(zhí)行finish方法的時候洲敢,調(diào)用了onPostExecute(result);使得結(jié)果得到了回調(diào)成功漫玄!

這里寫圖片描述

OK,執(zhí)行流程大概就是這么個樣子压彭!

總結(jié):
總的來說AsyncTask的內(nèi)部封裝了SERIAL_EXECUTOR(排隊線程池)睦优,THREAD_POOL_EXECUTOR(執(zhí)行線程池),以WorkerRunnable為子線程封裝可回調(diào)控制操作的FutureTask子線程哮塞,以及用于更新界面的一個內(nèi)部InternalHandler刨秆,這么一個結(jié)構(gòu)凳谦,理解起來并不是很難忆畅!關(guān)鍵是人家的這種設(shè)計和一些api的合理使用!

閑話少說尸执,年關(guān)了家凯,估計大伙都蠢蠢欲動!加油吧如失!

每天進步一點點绊诲,時間會讓你成為巨人!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褪贵,一起剝皮案震驚了整個濱河市掂之,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脆丁,老刑警劉巖世舰,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異槽卫,居然都是意外死亡跟压,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門歼培,熙熙樓的掌柜王于貴愁眉苦臉地迎上來震蒋,“玉大人,你說我怎么就攤上這事躲庄〔槠剩” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵噪窘,是天一觀的道長笋庄。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么无切? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任荡短,我火速辦了婚禮,結(jié)果婚禮上哆键,老公的妹妹穿的比我還像新娘掘托。我一直安慰自己,他們只是感情好籍嘹,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布闪盔。 她就那樣靜靜地躺著,像睡著了一般辱士。 火紅的嫁衣襯著肌膚如雪泪掀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天颂碘,我揣著相機與錄音异赫,去河邊找鬼。 笑死头岔,一個胖子當(dāng)著我的面吹牛塔拳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播峡竣,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼靠抑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了适掰?” 一聲冷哼從身側(cè)響起颂碧,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎类浪,沒想到半個月后载城,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡戚宦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年个曙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片受楼。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡垦搬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艳汽,到底是詐尸還是另有隱情猴贰,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布河狐,位于F島的核電站米绕,受9級特大地震影響瑟捣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜栅干,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一迈套、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碱鳞,春花似錦桑李、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至崩泡,卻和暖如春禁荒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背角撞。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工呛伴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人靴寂。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓磷蜀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親百炬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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