第三周

Handler

Handler 的功能


Handler 最常用的功能就是更新 UI来颤。因?yàn)?Android 只能在主線程中更新 UI汰扭,但是更新 UI 之前往往要先更新數(shù)據(jù),這就需要一些 I/O 操作福铅,比如請求網(wǎng)絡(luò)數(shù)據(jù)萝毛,或者讀寫文件。但是這些 I/O 操作大部分都比較耗時(shí)滑黔。而 Android 中的耗時(shí)操作又需要在子線程中執(zhí)行笆包。所以當(dāng)耗時(shí)操作完成后我們需要將更新 UI 的操作切換到主線程,或者說將更新的數(shù)據(jù)發(fā)送到主線程略荡。此時(shí)就用到了 Handler庵佣。從上面的描述中我們可以看到 Handler 的作用是將數(shù)據(jù)從子線程發(fā)送到主線程里去操作。那么同樣的我們也可以將數(shù)據(jù)從主線程發(fā)送到子線程汛兜。此時(shí)巴粪,我可以得出結(jié)論,Handler 的功能是:實(shí)現(xiàn)線程間的數(shù)據(jù)傳遞粥谬。

Handler 用法

因?yàn)?Handler 工作時(shí)需要 Looper肛根,所以我們要為當(dāng)前線程創(chuàng)建一個(gè) Looper。如下面代碼:

Java

newThread("Thread2"){

@Overridepublicvoidrun(){

Looper.prepare();

Handlerhandler=newHandler();

Looper.loop();

}

}.start();

但是 Android 的主線程會(huì)為我們默認(rèn)初始化 Looper漏策,所以如果在主線程中使用 Handler 就無需手動(dòng)創(chuàng)建 Looper派哲。通常情況下,我們使用 Handler 的默認(rèn)工造函數(shù)創(chuàng)建 Handler 對象掺喻,并重寫其 handleMessage 方法芭届。代碼如下:

Java

privateHandlerhandler=newHandler(){

@OverridepublicvoidhandleMessage(Messagemsg){

//處理Message 储矩,比如更新 UI

}

};

然后,在耗時(shí)操作完成后喉脖,發(fā)送攜帶數(shù)據(jù)的 Message椰苟,代碼如下:

Java

newThread("Thread3"){

@Overridepublicvoidrun(){

//耗時(shí)操作,比如請求網(wǎng)絡(luò)

Messagemsg=Message.obtain();

handler.sendMessage(msg);

}

}.start();

其次树叽,Handler 還可以通過 post 方法將一個(gè) Runnable 對象投遞到 Handler 中去處理舆蝴。代碼如下:

Java

handler.post(newRunnable(){

@Overridepublicvoidrun(){

}

});

在上述代碼中,我們使用匿名內(nèi)部類的方式來使用 Handler,但是這種方式往往會(huì)導(dǎo)致內(nèi)存泄露题诵。因?yàn)槟涿麅?nèi)部類默認(rèn)持有外部類的引用洁仗,如果我們在 Activity 中通過上述代碼使用 Handler,那么上述 Handler 對象將持有 Activity 的引用性锭。而執(zhí)行耗時(shí)操作的子線程持有 Handler 的引用赠潦。如果我們在耗時(shí)操作完成之前退出 Activity,而耗時(shí)操作還沒有完成草冈,那么子線程將繼續(xù)在后臺(tái)執(zhí)行她奥,將導(dǎo)致 Activity 不能被正常的銷毀回收,所以將導(dǎo)致內(nèi)存泄露怎棱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哩俭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拳恋,更是在濱河造成了極大的恐慌凡资,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谬运,死亡現(xiàn)場離奇詭異隙赁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)梆暖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門伞访,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人轰驳,你說我怎么就攤上這事咐扭。” “怎么了滑废?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長袜爪。 經(jīng)常有香客問我蠕趁,道長,這世上最難降的妖魔是什么辛馆? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任俺陋,我火速辦了婚禮豁延,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腊状。我一直安慰自己诱咏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布缴挖。 她就那樣靜靜地躺著袋狞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪映屋。 梳的紋絲不亂的頭發(fā)上苟鸯,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音棚点,去河邊找鬼早处。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瘫析,可吹牛的內(nèi)容都是我干的砌梆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贬循,長吁一口氣:“原來是場噩夢啊……” “哼咸包!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起甘有,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诉儒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后亏掀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忱反,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年滤愕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了温算。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡间影,死狀恐怖注竿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情魂贬,我是刑警寧澤巩割,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站付燥,受9級特大地震影響宣谈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜键科,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一闻丑、第九天 我趴在偏房一處隱蔽的房頂上張望漩怎。 院中可真熱鬧,春花似錦嗦嗡、人聲如沸勋锤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叁执。三九已至,卻和暖如春卑硫,著一層夾襖步出監(jiān)牢的瞬間徒恋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工欢伏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留入挣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓硝拧,卻偏偏與公主長得像径筏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子障陶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

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