Handler機(jī)制的原理及使用

? ?最近幾天公司的項(xiàng)目迭代了一個(gè)版本张遭,閑來(lái)無(wú)事瞬项,想對(duì)一些基礎(chǔ)知識(shí)進(jìn)行回顧下岁经,靈光一現(xiàn)就想到了Handler機(jī)制朋沮,因?yàn)檫@個(gè)在android實(shí)際的開發(fā)過(guò)程中還是很常見(jiàn)的,有了它缀壤,我們可以在完成一個(gè)很長(zhǎng)時(shí)間的任務(wù)后做出相應(yīng)的通知樊拓,例如更新UI,接下來(lái)切入正題塘慕。


Handler 可以 和Looper 來(lái)滿足咱們線程間的通信筋夏。Handler先進(jìn)先出原則。而Looper類用來(lái)管理特定線程內(nèi)對(duì)象之間的消息交換图呢。

1条篷、在UI線程中可以產(chǎn)生一個(gè)Looper對(duì)象骗随,用Looper來(lái)管理此線程里的MessageQueue(消息隊(duì)列)。

2赴叹、在Handler中你可以構(gòu)造Handler對(duì)象來(lái)與Looper溝通鸿染,以便更新新的消息MessageQueue里;或者接收Looper從Message Queue取出所送來(lái)的消息。Message Queue就是用來(lái)存放線程放入的消息

3稚瘾、使用handler的同學(xué)都知道牡昆,當(dāng)咱們的UIthread隊(duì)列,如果處理一個(gè)消息超過(guò)5秒時(shí),android 就會(huì)拋出一個(gè) ANR(android程序無(wú)響應(yīng))的消息,So,我們需要把一些要處理比較長(zhǎng)的消息,在子線程中進(jìn)行處理,把處理后的結(jié)果,返回給主線程就可以了,來(lái)看看兩張關(guān)系圖(很經(jīng)典又直觀的圖)

Handler來(lái)進(jìn)行線程建的通信
Handler,Message,Message Queue 之間的關(guān)系圖

4、理清楚原理來(lái)看看handler中常用的方法

①摊欠,更新一個(gè)組件的內(nèi)容

handler.post(new Runnable(){

@Override

public void run() {

//do something 寫更新UI

}});

可以創(chuàng)建多線程消息的方法

handler.postDelayed(runnable, 2000);//使用postDelayed方法后丢烘,2秒執(zhí)行runnable的操作

實(shí)際上也就實(shí)現(xiàn)了一個(gè)2s的一個(gè)定時(shí)器

handler.removeCallbacks(runnable);//這個(gè)可以關(guān)閉定時(shí)器

Handler handler =newHandler();

handler.postDelayed(newRunnable() {

@Override

public voidrun() {

//常見(jiàn)于啟動(dòng)界面的時(shí)候,有一個(gè)延時(shí)的加載

startActivity(newIntent(MainActivity.this,SecondActivity.class));/

MainActivity.this.finish();

}},2000);

sendMessage(new Message) 指在Handler在發(fā)送消息的時(shí)候些椒,需要發(fā)送一個(gè)新的對(duì)象

class UpdateProgressBar Thread implements Runnable{

@Override

publicvoid run() {

int progress =0;

while( progress <= 100){

Message msg =new Message();

msg.arg1 = progress;

handler.sendMessage(msg);

progress += 10;

try{

Thread.sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();}}

Message msg = handler.obtainMessage();

msg.arg1 = -1;

handler.sendMessage(msg);}}

④播瞳、HandlerThread是一個(gè)帶有消息循環(huán)的線程,并且有自己的消息隊(duì)列免糕,能夠接受其他線程發(fā)送消息赢乓。使用方法Java代碼如下:

HandlerThread mHandlerThread=newHandlerThread("handlerThread");

mHandlerThread.start();//啟動(dòng)線程

Handler mHandler =newHandler(tt.getLooper());

mHandler.postDelayed(newRunnable() {

@Override

publicvoidrun() {

Log.i("lukey","ThreadName:"+ Thread.currentThread().getName());

((HandlerThread)Thread.currentThread()).getLooper().quit();//關(guān)閉消息循環(huán),退出線程

}},1000);

5石窑、Message作為handler接受的對(duì)象,我們有必要知道Message這個(gè)數(shù)據(jù)類型是個(gè)怎樣的數(shù)據(jù)類型,我們來(lái)看看message 關(guān)于數(shù)據(jù)的字段

public int what

public int arg1

public int arg2

public Object obj

message 提供了一個(gè)對(duì)象來(lái)存儲(chǔ)對(duì)象,而且,還提供了三個(gè)int字段用來(lái)存儲(chǔ)少量int類型牌芋,除了以上三個(gè)Message自有的字段外,咱們還可以通過(guò)setData(Bundle b),來(lái)存儲(chǔ)一個(gè)Bundle對(duì)象,來(lái)存儲(chǔ)更豐富的數(shù)據(jù)類型和圖片.在初始化我們的message的時(shí)候就可以為我們的Message默認(rèn)字段賦值

Message msg = obtainMessage();

//按照順序設(shè)置我們what 字段的初值

Message msg = mHandler.obtainMessage(int what);

Message msg = mHandler.obtainMessage(int what,Object object);

Message msg = mHandler.obtainMessage(int what,int arg1,int arg2);

Message msg = mHandler.obtainMessage(int what,int arg1,int arg2, Object obj);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市松逊,隨后出現(xiàn)的幾起案子躺屁,更是在濱河造成了極大的恐慌陈醒,老刑警劉巖谨朝,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拢肆,居然都是意外死亡烁兰,警方通過(guò)查閱死者的電腦和手機(jī)耐亏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)沪斟,“玉大人广辰,你說(shuō)我怎么就攤上這事”倚” “怎么了轨域?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)杀餐。 經(jīng)常有香客問(wèn)我,道長(zhǎng)朱巨,這世上最難降的妖魔是什么史翘? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上琼讽,老公的妹妹穿的比我還像新娘必峰。我一直安慰自己,他們只是感情好钻蹬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布吼蚁。 她就那樣靜靜地躺著,像睡著了一般问欠。 火紅的嫁衣襯著肌膚如雪肝匆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天顺献,我揣著相機(jī)與錄音旗国,去河邊找鬼。 笑死注整,一個(gè)胖子當(dāng)著我的面吹牛能曾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肿轨,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寿冕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了椒袍?” 一聲冷哼從身側(cè)響起驼唱,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎槐沼,沒(méi)想到半個(gè)月后曙蒸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岗钩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年纽窟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兼吓。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡臂港,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出视搏,到底是詐尸還是另有隱情审孽,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布浑娜,位于F島的核電站佑力,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏筋遭。R本人自食惡果不足惜打颤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一暴拄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧编饺,春花似錦乖篷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至秽誊,卻和暖如春鲸沮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背养距。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工诉探, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棍厌。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓肾胯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親耘纱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敬肚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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