日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android开发中Handler的经典总结

發(fā)布時間:2025/5/22 Android 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android开发中Handler的经典总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

當(dāng)應(yīng)用程序啟動時,Android首先會開啟一個主線程(也就是UI線程),主線程為管理界面中的UI控件,進(jìn)行事件分發(fā)。

AD:

一、Handler的定義:

主要接受子線程發(fā)送的數(shù)據(jù), 并用此數(shù)據(jù)配合主線程更新UI。

解釋:當(dāng)應(yīng)用程序啟動時,Android首先會開啟一個主線程 (也就是UI線程) , 主線程為管理界面中的UI控件, 進(jìn)行事件分發(fā), 比如說, 你要是點(diǎn)擊一個 Button ,Android會分發(fā)事件到Button上,來響應(yīng)你的操作。? 如果此時需要一個耗時的操作,例如: 聯(lián)網(wǎng)讀取數(shù)據(jù),? ? 或者讀取本地較大的一個文件的時候,你不能把這些操作放在主線程中,如果你放在主線程中的話,界面會出現(xiàn)假死現(xiàn)象, 如果5秒鐘還沒有完成的話,會收到Android系統(tǒng)的一個錯誤提示? "強(qiáng)制關(guān)閉"。? 這個時候我們需要把這些耗時的操作,放在一個子線程中,因?yàn)樽泳€程涉及到UI更新,,Android主線程是線程不安全的, 也就是說,更新UI只能在主線程中更新,子線程中操作是危險的。 這個時候,Handler就出現(xiàn)了。,來解決這個復(fù)雜的問題 ,由于Handler運(yùn)行在主線程中(UI線程中),? 它與子線程可以通過Message對象來傳遞數(shù)據(jù), 這個時候,Handler就承擔(dān)著接受子線程傳過來的(子線程用sedMessage()方法傳弟)Message對象,(里面包含數(shù)據(jù))? , 把這些消息放入主線程隊(duì)列中,配合主線程進(jìn)行更新UI。

二、Handler一些特點(diǎn)

handler可以分發(fā)Message對象和Runnable對象到主線程中, 每個Handler實(shí)例,都會綁定到創(chuàng)建他的線程中(一般是位于主線程),它有兩個作用:

(1)安排消息或Runnable 在某個主線程中某個地方執(zhí)行;

(2)安排一個動作在不同的線程中執(zhí)行。

Handler中分發(fā)消息的一些方法

post(Runnable)

postAtTime(Runnable,long)

postDelayed(Runnable long)

sendEmptyMessage(int)

sendMessage(Message)

sendMessageAtTime(Message,long)

sendMessageDelayed(Message,long)

以上post類方法允許你排列一個Runnable對象到主線程隊(duì)列中,

sendMessage類方法, 允許你安排一個帶數(shù)據(jù)的Message對象到隊(duì)列中,等待更新。

三、Handler實(shí)例

子類需要繼承Hendler類,并重寫handleMessage(Message msg) 方法, 用于接受線程數(shù)據(jù)。

以下為一個實(shí)例,它實(shí)現(xiàn)的功能為:通過線程修改界面Button的內(nèi)容

  • public?class?MyHandlerActivity?extends?Activity?{?
  • ????Button?button;?
  • ????MyHandler?myHandler;?
  • ?
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{?
  • ????????super。onCreate(savedInstanceState);?
  • ????????setContentView(R。layout。handlertest);?
  • ?
  • ????????button?=?(Button)?findViewById(R。id。button);?
  • ????????myHandler?=?new?MyHandler();?
  • ????????//?當(dāng)創(chuàng)建一個新的Handler實(shí)例時,?它會綁定到當(dāng)前線程和消息的隊(duì)列中,開始分發(fā)數(shù)據(jù)?
  • ????????//?Handler有兩個作用,?(1)?:?定時執(zhí)行Message和Runnalbe?對象?
  • ????????//?(2):?讓一個動作,在不同的線程中執(zhí)行。?
  • ?
  • ????????//?它安排消息,用以下方法?
  • ????????//?post(Runnable)?
  • ????????//?postAtTime(Runnable,long)?
  • ????????//?postDelayed(Runnable,long)?
  • ????????//?sendEmptyMessage(int)?
  • ????????//?sendMessage(Message);?
  • ????????//?sendMessageAtTime(Message,long)?
  • ????????//?sendMessageDelayed(Message,long)?
  • ??????
  • ????????//?以上方法以?post開頭的允許你處理Runnable對象?
  • ????????//sendMessage()允許你處理Message對象(Message里可以包含數(shù)據(jù),)?
  • ?
  • ????????MyThread?m?=?new?MyThread();?
  • ????????new?Thread(m)。start();?
  • ????}?
  • ?
  • ????/**?
  • ????*?接受消息,處理消息?,此Handler會與當(dāng)前主線程一塊運(yùn)行?
  • ????*?*/?
  • ?
  • ????class?MyHandler?extends?Handler?{?
  • ????????public?MyHandler()?{?
  • ????????}?
  • ?
  • ????????public?MyHandler(Looper?L)?{?
  • ????????????super(L);?
  • ????????}?
  • ?
  • ????????//?子類必須重寫此方法,接受數(shù)據(jù)?
  • ????????@Override?
  • ????????public?void?handleMessage(Message?msg)?{?
  • ????????????//?TODO?Auto-generated?method?stub?
  • ????????????Log。d("MyHandler",?"handleMessage。。。。。。");?
  • ????????????super。handleMessage(msg);?
  • ????????????//?此處可以更新UI?
  • ????????????Bundle?b?=?msg。getData();?
  • ????????????String?color?=?b。getString("color");?
  • ????????????MyHandlerActivity。this。button。append(color);?
  • ?
  • ????????}?
  • ????}?
  • ?
  • ????class?MyThread?implements?Runnable?{?
  • ????????public?void?run()?{?
  • ?
  • ????????????try?{?
  • ????????????????Thread。sleep(10000);?
  • ????????????}?catch?(InterruptedException?e)?{?
  • ????????????????//?TODO?Auto-generated?catch?block?
  • ????????????????e。printStackTrace();?
  • ????????????}?
  • ?
  • ????????????Log。d("thread。。。。。。。",?"mThread。。。。。。。。");?
  • ????????????Message?msg?=?new?Message();?
  • ????????????Bundle?b?=?new?Bundle();//?存放數(shù)據(jù)?
  • ????????????b。putString("color",?"我的");?
  • ????????????msg。setData(b);?
  • ?
  • ????????????MyHandlerActivity。this。myHandler。sendMessage(msg);?//?向Handler發(fā)送消息,更新UI?
  • ?
  • ????????}?
  • ????}?
  • }
  • 轉(zhuǎn)載于:https://www.cnblogs.com/TECHNOLOGYer/p/4780161.html

    總結(jié)

    以上是生活随笔為你收集整理的Android开发中Handler的经典总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。