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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

线程间通信: Handler , Looper, MessageQueue, Message (完结)

發布時間:2023/12/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程间通信: Handler , Looper, MessageQueue, Message (完结) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
概述:? ? 為了 線程間 通信方便, Handler 機制 通過 Handler 和 Looper, MessageQueue, Message 這些 類 之間的協作, 簡化 多線程的開發. ?線程的交互 會被封裝 到 Message 中, 然后 通過 Handler 的方法 把 消息 放到 MessageQueue 消息隊列中, 實現 Handler 機制的線程 都會 調用 Looper 的 loop() 方法, 則 Looper 作為 消息分發者的 作用就體現出來了. ?loop() 方法中, 會 從消息隊列 MessageQueue 中 獲取 Message, 然后 將 獲取到的Message 丟給 負責 處理消息的 Handler . ?Handler 再 ?根據 Message 中的 callback(Runnable) 是否為 空 以及 Handler 中的 回調 mCallback(Handler.Callback) 是否為空 來決定 最終交給 哪個 方法進行消息處理.? ----------------------------------------------------------------------------------------------------------------------- Handler 機制中, 各個角色的分工如下: 1. Handler : ?負責消息(Message) 的發送 和 處理 2. Looper : 負責 消息的 分發 3. MessageQueue : 負責消息的 管理 4. Message : ?帶有 int 型參數 what 以及 arg1 和 arg2,這些是為了 簡化 通過 setData(Bundle bundle) 設置的 數據, ?以及 一個 任意 對象的 參數 obj. ?如果期望的 話 還 可以 帶一個 Runnable 類型的參數 callback, -------------------------------------------------------------------------------------------------------------------- 第一部分: ?Handler?
  • Handler 的創建 ?:?
1. ?如果 參數 有 Looper 則 把 Looper 賦值給 mLooper 否則 則 把 當前 線程 對應的 Looper 賦值給 mLooper. ? ?2. ? 獲取 Looper 對應的 消息 隊列 mQueue. ? 3. ?如果 構造函數的參數中 包含 Handler.Callback 的 實例 callBack 則 把其 賦值給 mCallback 變量.
  • Handler 消息的發送: ?
1. 要 發送的消息 內容 有 兩種 ?一種 ?Runnable ?另一種 ?Message. 通過 跟蹤 post 的實現, 則 可以發現 Runnable ?也 被 轉化 為 Message 對象了. 圖1: 圖2: 2. ?消息發送 調用的 常見方法有 : ?post(Runnable), postDelayed(Runnable,long), 以及 sendEmptyMessage(int), sendMessage(Message) , sendMessageDelayed(Message,long) 這些方法都會 歸宗于 : sendMessageAtTime()? 在 sendMessageAtTime 中 主要 是把 ?Message 對應的 target 參數 設置為 當前 Handler, 然后 把 此 msg 放入 MessageQueue 隊列中, 3. 消息 處理時 對應的方法回調: handle 消息 處理的位置 有 三處: 其1: ?當 消息為 Runnable 消息的時候, 則 msg 的 callback (即 Runnable 對象) 是不為 空的, 則 直接 調用 ?msg.callback.run() 執行 回調. 其2: 當我們在 構造 Handler 的時候 有 傳入 Handler.Callback 回調對象的時候, 則 mCallback 不為空( 由 Handler 的構造函數 可知), 則 調用 Handler.Callback 這個 接口 對應的 handleMessage() 方法.? 其3: 如果 沒有前面 兩種, 則 在 創建 Handler 的 子類 或者 匿名對象的時候 會 重載 handleMessage 來 處理對應的 回調邏輯. 第二部分: Looper?
  • ?looper 的初始化:
當 調用 Looper 的靜態 方法 prepare() 的時候則 會創建 一個 Looper 對象, 并設置 到一個 靜態的縣城局部變量中去. 在 Looper 的構造函數中, 可以看到 會創建 一個 MessageQueue 對象, MessageQueue 作為 消息隊列.
  • Looper.loop() 方法的調用
一個線程 調用 prepare() 只是 準備好了消息隊列, 進入 消息隊列的 等待, 則是 調用 Looper 的 loop() 方法: 透過 loop() 方法的實現, 可以知道 首先從 當前 線程對應的 Looper 中 獲取到 對應的消息 隊列, 然后 從 消息 隊列中 獲取 下一條 要執行 的 message, 當 獲取到的 Message 為 null 的時候則 直接退出循環.? 如果 msg 不為null, 則 調用 Message 中 對應的 Handler 對象的 ?dispatchMessage 方法 進行消息的分發. 消息的具體分發 已在上面 講過了. 在 queue.next() 語句的 上面 可以 看到 for 循環 是一個 死 循環, 則 可以知道 當 ?線程 調用 loop() 方法之后 就不會 繼續往 下執行, 而 是在 等待 消息列表(queue) 返回消息 , 然后 將 ?消息 丟給 Handler 進行處理.

轉載于:https://www.cnblogs.com/devinzhou/p/3578157.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的线程间通信: Handler , Looper, MessageQueue, Message (完结)的全部內容,希望文章能夠幫你解決所遇到的問題。

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