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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Handler(2)

發布時間:2023/12/2 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Handler(2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

andriod提供了Handler?和?Looper?來滿足線程間的通信。Handler先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(MessageExchange)

1)Looper:?一個線程可以產生一個Looper對象,由它來管理此線程里的MessageQueue(消息隊列)。?
2)Handler:?你可以構造Handler對象來與Looper溝通,以便push新消息到MessageQueue;或者接收LooperMessage?Queue取出)所送來的消息。
3)?Message?Queue(消息隊列):用來存放線程放入的消息。?

4)線程:UIthread?通常就是main?thread,而Android啟動程序時會替它建立一個MessageQueue。?

1.Handler創建消息

????????每一個消息都需要被指定的Handler處理,通過Handler創建消息便可以完成此功能。Android消息機制中引入了消息池。Handler創建消息時首先查詢消息池中是否有消息存在,如果有直接從消息池中取得,如果沒有則重新初始化一個消息實例。使用消息池的好處是:消息不被使用時,并不作為垃圾回收,而是放入消息池,可供下次Handler創建消息時使用。消息池提高了消息對象的復用,減少系統垃圾回收的次數。消息的創建流程如圖所示。

?

2.Handler發送消息

UI主線程初始化第一個Handler時會通過ThreadLocal創建一個Looper,該LooperUI主線程一一對應。使用ThreadLocal的目的是保證每一個線程只創建唯一一個Looper。之后其他Handler初始化的時候直接獲取第一個Handler創建的LooperLooper初始化的時候會創建一個消息隊列MessageQueue。至此,主線程、消息循環、消息隊列之間的關系是1:1:1

HandlerLooperMessageQueue的初始化流程如圖所示:

?

Hander持有對UI主線程消息隊列MessageQueue和消息循環Looper的引用,子線程可以通過Handler將消息發送到UI線程的消息隊列MessageQueue中。3.Handler處理消息

UI主線程通過Looper循環查詢消息隊列UI_MQ,當發現有消息存在時會將消息從消息隊列中取出。首先分析消息,通過消息的參數判斷該消息對應的Handler,然后將消息分發到指定的Handler進行處理。

子線程通過HandlerLooperUI主線程通信的流程如圖所示。


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

?

二、Handler一些特點
????????handler可以分發Message對象和Runnable對象到主線程中,?每個Handler實例,都會綁定到創建他的線程中(一般是位于主線程),
????????它有兩個作用:?(1):??安排消息或Runnable?在某個主線程中某個地方執行,?(2)安排一個動作在不同的線程中執行
??????
????????Handler中分發消息的一些方法
????????post(Runnable)
????????postAtTime(Runnable,long)
????????postDelayed(Runnable?long)
????????sendEmptyMessage(int)
????????sendMessage(Message)
????????sendMessageAtTime(Message,long)
????????sendMessageDelayed(Message,long)
????????以上post類方法允許你排列一個Runnable對象到主線程隊列中,
????????sendMessage類方法,?允許你安排一個帶數據的Message對象到隊列中,等待更新.

三、Handler實例
??????(1)?子類需要繼承Handler類,并重寫handleMessage(Message?msg)?方法,?用于接受線程數據
??????以下為一個實例,它實現的功能為?:?通過線程修改界面Button的內容

?1?public?class?MyHandlerActivity?extends?Activity?{
?2?????Button?button;
?3?????MyHandler?myHandler;
?4?
?5?????protected?void?onCreate(Bundle?savedInstanceState)?{
?6?????????super.onCreate(savedInstanceState);
?7?????????setContentView(R.layout.handlertest);
?8?
?9?????????button?=?(Button)?findViewById(R.id.button);
10?????????myHandler?=?new?MyHandler();
11?????????//?當創建一個新的Handler實例時,?它會綁定到當前線程和消息的隊列中,開始分發數據
12?????????//?Handler有兩個作用,?(1)?:?定時執行MessageRunnalbe?對象
13?????????//?(2):?讓一個動作,在不同的線程中執行.
14?
15?????????//?它安排消息,用以下方法
16?????????//?post(Runnable)
17?????????//?postAtTime(Runnable,long)
18?????????//?postDelayed(Runnable,long)
19?????????//?sendEmptyMessage(int)
20?????????//?sendMessage(Message);
21?????????//?sendMessageAtTime(Message,long)
22?????????//?sendMessageDelayed(Message,long)
23???????
24?????????//?以上方法以?post開頭的允許你處理Runnable對象
25?????????//sendMessage()允許你處理Message對象(Message里可以包含數據,)
26?
27?????????MyThread?m?=?new?MyThread();
28?????????new?Thread(m).start();
29?????}
30?
31?????/**
32?????*?接受消息,處理消息?,Handler會與當前主線程一塊運行
33?????*?*/
34?
35?????class?MyHandler?extends?Handler?{
36?????????public?MyHandler()?{
37?????????}
38?
39?????????public?MyHandler(Looper?L)?{
40?????????????super(L);
41?????????}
42?
43?????????//?子類必須重寫此方法,接受數據
44?????????@Override
45?????????public?void?handleMessage(Message?msg)?{
46?????????????//?TODO?Auto-generated?method?stub
47?????????????Log.d("MyHandler",?"handleMessage......");
48?????????????super.handleMessage(msg);
49?????????????//?此處可以更新UI
50?????????????Bundle?b?=?msg.getData();
51?????????????String?color?=?b.getString("color");
52?????????????MyHandlerActivity.this.button.append(color);
53?
54?????????}
55?????}
56?
57?????class?MyThread?implements?Runnable?{
58?????????public?void?run()?{
59?
60?????????????try?{
61?????????????????Thread.sleep(10000);
62?????????????}?catch?(InterruptedException?e)?{
63?????????????????//?TODO?Auto-generated?catch?block
64?????????????????e.printStackTrace();
65?????????????}
66?
67?????????????Log.d("thread.......",?"mThread........");
68?????????????Message?msg?=?new?Message();
69?????????????Bundle?b?=?new?Bundle();//?存放數據
70?????????????b.putString("color",?"我的");
71?????????????msg.setData(b);
72?
73?????????????MyHandlerActivity.this.myHandler.sendMessage(msg);?//?Handler發送消息,更新UI,sendMessage(“消息”)來傳遞消息
74?
75?????????}
76?????}
77?

?

78?}?

?

?

轉載于:https://www.cnblogs.com/wangmars/p/3239509.html

總結

以上是生活随笔為你收集整理的Handler(2)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。