????????作為一個(gè)Android開發(fā)人員,提到Handler應(yīng)該并不陌生膜蛔。簡(jiǎn)單的來(lái)說(shuō)坛猪,它就是一套Google給我們提供的一套可以用來(lái)更新UI的機(jī)制,當(dāng)然它還有處理消息和接發(fā)消息的功能皂股。當(dāng)我們new 一個(gè)子線程進(jìn)行UI操作的時(shí)候砚哆,會(huì)拋出一個(gè)異常,見下圖
當(dāng)直接在子線程更新UI拋出的異常信息
????????這個(gè)異常的大概意思是說(shuō)屑墨,我們不能在子線程中進(jìn)行更新UI的操作躁锁,那么這時(shí)候,就該我們的Handler 上場(chǎng)了卵史。
????????那么战转,為什么要使用Handler ?大概是Google的攻城獅們考慮到了廣大的Android 開發(fā)者對(duì)于多線程的煩惱以躯,所以在設(shè)計(jì)Android的時(shí)候槐秧,封裝了一套消息的創(chuàng)建啄踊,傳遞,還有處理的機(jī)制刁标,如果不通過(guò)它颠通,我們是沒(méi)有辦法更新UI信息的,如果強(qiáng)行更新膀懈,就會(huì)出現(xiàn)上圖的錯(cuò)誤顿锰。
Handler的用法
1.簡(jiǎn)單用法
? ? ? ? 在Android 中,我們對(duì)于Handler 的基本用法启搂,大概就是主線程(UI線程)和子線程之間的通訊了吧硼控。我們一般會(huì)將耗時(shí)的操作(比如聯(lián)網(wǎng)獲取數(shù)據(jù)等),new 一個(gè)線程并在其中進(jìn)行相關(guān)操作胳赌,然后將獲取到的數(shù)據(jù)或者運(yùn)算的結(jié)果通過(guò)Handler 傳遞給我們的主線程(UI線程)牢撼,然后主線程通過(guò)這些接受到的數(shù)據(jù),進(jìn)行相關(guān)的操作疑苫,比如更新UI等熏版。
? ? ? ? 舉個(gè)栗子,新建一個(gè)Test項(xiàng)目捍掺,如下圖:
創(chuàng)建的MainActivity中的代碼
在這里撼短,我們直接new 了一個(gè) 線程(Thread),并且在其中給我們已經(jīng)在布局文件中聲明的一個(gè)TextView 控件賦值為(“Thread")乡小,然后我們運(yùn)行以后,就出現(xiàn)了我們第一張圖出現(xiàn)的錯(cuò)誤饵史。在這里需要注意的是满钟,在new 一個(gè) Thread 以后,結(jié)尾一定要記得執(zhí)行start()方法胳喷,不然這段代碼是不會(huì)執(zhí)行的湃番,我們也就看不到相應(yīng)的效果了。
? ? ? ? 那么吭露,如果使用Handler 的話吠撮,該怎么改這段代碼呢?我們接著來(lái):
使用Handler以后的代碼
? ? ? ? 好了讲竿,現(xiàn)在已經(jīng)完成了Handler的基本用法泥兰,首先我們new 出了一個(gè)Handler 出來(lái),然后在下面的MainActivity()中依舊模擬了一個(gè)聯(lián)網(wǎng)的耗時(shí)操作题禀,然后使用handler 發(fā)送了一條消息鞋诗,當(dāng)上面的Handler收到這條消息以后,就進(jìn)行了setText()的操作迈嘹,這次削彬,程序沒(méi)有崩潰全庸,TextView的文字也成功的賦值成為"Handler",至此融痛,Handler的簡(jiǎn)單運(yùn)用已經(jīng)完成了壶笼,我們簡(jiǎn)單的完成了一次主線程和子線程之間的通信,運(yùn)行效果如下:
使用Handler以后的效果
? ? ? ? 下一篇雁刷,我們將繼續(xù)探索覆劈,Handler的進(jìn)階用法