AsyncTask x 問

1. onPreExecute是否一定在UI線程執(zhí)行?

答: 不一定释漆。onPreExecute是調(diào)用execute()的線程執(zhí)行, 是在任務(wù)真正被插入到工作隊(duì)列之前執(zhí)行。早期的android要求execute()方法:必須在UI線程執(zhí)行够傍,因此onPreExceute會(huì)在UI線程執(zhí)行。較新的android版本挠铲,不再要求execute()在ui線程執(zhí)行冕屯,因此onPreExceute是在調(diào)用execute的線程執(zhí)行。

2. onPostExecute/onProgressUpdate是否在UI線程執(zhí)行?

答: 是的拂苹,這兩個(gè)方法都是通過Handler執(zhí)行安聘,運(yùn)行在UI線程中?

3. AsyncTask默認(rèn)是并行執(zhí)行還是串行的? 為什么要這樣?

答: 3.0之前默認(rèn)是串行,3.0~4.0默認(rèn)是并行浴韭,4.0之后默認(rèn)是串行带迟。
之所以改并行,當(dāng)然是為了效率考慮囱桨,利用線程池仓犬,提高并發(fā)性,但之后考慮到多線程可能存在一些線程安全問題舍肠,又改回串行了搀继。注意: AsyncTask本身只是一個(gè)線程池的封裝,既然是多線程翠语,必然存在線程安全問題叽躯,而這個(gè)問題需要程序員自身去保證,只要確保程序的線程安全性肌括,使用AysncTask并發(fā)模式是沒有任何問題的点骑。

4. AsyncTask線程池有多少個(gè)core線程,以及最大線程數(shù)?

答: coreSize = Math.max(2, Math.min(4, cpuCount - 1)), 也就是最少兩個(gè)谍夭,最多四個(gè)黑滴,具體多少跟cpu核心數(shù)相關(guān),考慮到目前主流機(jī)器都是4核以上紧索,coreSize也基本是四個(gè)袁辈。maximumSize = cpuCount * 2 + 1。由于默認(rèn)的并行隊(duì)列設(shè)置了allowCoreThreadTimeout珠漂,但空閑太久時(shí)晚缩,core thread也會(huì)被回收。

5. 任務(wù)隊(duì)列最大等待數(shù)是多少媳危?超出之后會(huì)怎樣? 如何避免問題

答:默認(rèn)的任務(wù)隊(duì)列容量是128, 若隊(duì)列已滿荞彼,再往隊(duì)列添加任務(wù),就會(huì)拋出RejectedExecutionException(這是java線程池默認(rèn)處理方式).
由于AsyncTask并沒有提供設(shè)置線程池RejectedExecutionHandler的方法待笑,因此鸣皂,想要避免這個(gè)異常,只能自己創(chuàng)建線程池, 并通過setDefaultExcutor方法為AsyncTask設(shè)置默認(rèn)線程池滋觉。

6. AsyncTask線程池的優(yōu)先級(jí)是什么?

答: 優(yōu)先級(jí)是THREAD_PRIORITY_BACKGROUND.

7. 如何獲取執(zhí)行結(jié)果?

答: 創(chuàng)建AsyncTask時(shí)签夭,其內(nèi)部會(huì)創(chuàng)建一個(gè)FutureTask, 改FutureTask封裝了doInBackground操作,執(zhí)行時(shí)就是將該FutureTask傳遞給線程池椎侠,因此獲取執(zhí)行結(jié)果就是通過FutureTask.get()方法獲取第租,AsyncTask提供了get()方法,封裝FutureTask.get(), 用于獲取結(jié)果我纪。

8. 如何取消一個(gè)任務(wù)慎宾,哪些任務(wù)是可以取消的?

答: 前面講到AsyncTask只是一個(gè)基于線程池和FutureTask的封裝丐吓,哪些任務(wù)可以取消也完全是線程池與FutureTask的邏輯,AsyncTask的cancel方法僅僅調(diào)用FutureTask的cancel趟据。因此哪些任務(wù)可取消券犁,就看FutureTask是否可取消⌒诩睿考慮調(diào)用cancel時(shí)粘衬,F(xiàn)utureTask的狀態(tài):

  1. 未開始執(zhí)行(New狀態(tài)): 這種情況下會(huì)將狀態(tài)置為(Interrupting或cancelled, 后續(xù)當(dāng)此FutureTask的run方法執(zhí)行時(shí),發(fā)現(xiàn)其狀態(tài)不是new, 會(huì)跳過執(zhí)行.
  2. 正在執(zhí)行(runner線程不等于null): 此時(shí)會(huì)根據(jù)參數(shù)mayInterruptIfRunning決定是否調(diào)用runner線程的interrupt方法咳促,注意: interrupt并不是中斷線程的意思稚新,只有當(dāng)線程處于wait(), sleep(), join()等方法上阻塞時(shí),這些方法會(huì)立即返回跪腹,且拋出InterruptionException褂删。若當(dāng)時(shí)線程正處于running狀態(tài)時(shí),interrupt方法僅僅設(shè)置線程為interrupted狀態(tài)冲茸,而不會(huì)中斷線程的執(zhí)行屯阀。
  3. 已執(zhí)行: 這種情況不會(huì)發(fā)生任何事情。

可以看出轴术,能cancel的主要是尚未開始執(zhí)行的任務(wù)难衰。cancel正在執(zhí)行的任務(wù),具有不可預(yù)知性膳音。并且很重要一點(diǎn)召衔,cancel并沒有將FutureTask從線程池的等待隊(duì)列移除,任然占據(jù)128中的一個(gè)位置祭陷。

9. 如何將一個(gè)Runnable交給AsyncTask框架執(zhí)行?

答: 這種情況主要是想把任務(wù)交個(gè)線程池執(zhí)行,而又沒有必要自己創(chuàng)建線程或線程池趣席,而借用AsyncTask的線程池完成兵志。通過AsyncTask的靜態(tài)方法execute(Runnable)完成。這種任務(wù)既不能獲取結(jié)果宣肚,也不能取消想罕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市霉涨,隨后出現(xiàn)的幾起案子按价,更是在濱河造成了極大的恐慌,老刑警劉巖笙瑟,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楼镐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡往枷,警方通過查閱死者的電腦和手機(jī)框产,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門凄杯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秉宿,你說我怎么就攤上這事戒突。” “怎么了描睦?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵膊存,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我忱叭,道長(zhǎng)膝舅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任窑多,我火速辦了婚禮仍稀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘埂息。我一直安慰自己技潘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布千康。 她就那樣靜靜地躺著享幽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拾弃。 梳的紋絲不亂的頭發(fā)上值桩,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音豪椿,去河邊找鬼奔坟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛搭盾,可吹牛的內(nèi)容都是我干的咳秉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼鸯隅,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼澜建!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蝌以,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤炕舵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后跟畅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咽筋,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年碍彭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晤硕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悼潭。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舞箍,靈堂內(nèi)的尸體忽然破棺而出舰褪,到底是詐尸還是另有隱情,我是刑警寧澤疏橄,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布占拍,位于F島的核電站,受9級(jí)特大地震影響捎迫,放射性物質(zhì)發(fā)生泄漏晃酒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一窄绒、第九天 我趴在偏房一處隱蔽的房頂上張望贝次。 院中可真熱鬧,春花似錦彰导、人聲如沸蛔翅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽山析。三九已至,卻和暖如春掏父,著一層夾襖步出監(jiān)牢的瞬間笋轨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工赊淑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爵政,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓膏燃,卻偏偏與公主長(zhǎng)得像茂卦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子组哩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • 前言 上一篇文章我們一起分析了Android消息機(jī)制的實(shí)現(xiàn)原理,通過分析我們知道处渣,Android系統(tǒng)規(guī)定不能在主線...
    孟校長(zhǎng)閱讀 528評(píng)論 4 8
  • 參考 https://www.baidu.com/link?url=QNRznJEBT25k0bpgVD3bOni...
    CodeInfo閱讀 381評(píng)論 0 0
  • 1. 導(dǎo)言 Android應(yīng)用在運(yùn)行時(shí)罐栈,所有UI相關(guān)的操作黍衙,必須放在主線程里,子線程(或者稱之為工作線程)中如果進(jìn)...
    CyanStone閱讀 435評(píng)論 0 2
  • 教練三部林珊10月10日感悟: 今天找大課場(chǎng)地明明是去現(xiàn)場(chǎng)踩點(diǎn)以便布場(chǎng)的荠诬,量完尺寸卻又甩出來一句:好像被定了琅翻,晚上...
    落子無悔ss閱讀 163評(píng)論 0 0
  • 今天我很開心學(xué)校發(fā)了校服位仁,放學(xué)后媽媽接我回家,媽媽做飯的時(shí)候我把校服穿上試了試正好方椎。穿著校服寫作業(yè)聂抢,等媽媽把飯做好...
    5998fafe5994閱讀 138評(píng)論 0 1