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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )

發布時間:2025/6/17 Android 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、Message 消息
  • 二、ThreadLocal 線程本地變量
  • 三、Looper 中的消息隊列 MessageQueue





一、Message 消息



模仿 Android 中的 Message 基本功能 , 提供 what 與 obj 變量 , 提供一個回收方法 ;

此外 , 還要指明下一個消息 , 以及是哪個 Handler 發送的該消息 ;

package kim.hsl.handler;public class Message {/*** 消息識別碼*/int what;/*** 消息對象*/Object obj;/*** 指向下一個消息*/Message next;/*** 該 Message 使用哪個 Handler 進行發送的*/Handler target;/*** 回收方法*/public void recyle(){obj = null;next = null;target = null;} }



二、ThreadLocal 線程本地變量



ThreadLocal 作用是 保存線程私有變量 ;

使用 ThreadLocal 維護一個變量時 , 每個使用該 ThreadLocal 線程本地變量 的線程 , 都會 被分配一個獨立的變量副本 ,

每個線程 只 可以 改變本線程內的 變量副本 , 即 ThreadLocal 線程本地變量 ;



1 . ThreadLocal 定義 :

/*** 一個線程只能有一個 Looper* 使用 ThreadLocal 來保存該 Looper* 該變量是線程內部存儲類 , 只能本線程才可以得到存儲的數據 ;*/static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<>();

2 . ThreadLocal 變量獲取 : 調用 ThreadLocal 變量的 get() 方法 , 可以獲取該 ThreadLocal 線程本地變量 ;

在 ThreadLocalMap map = getMap(t) 中 , 獲取的 ThreadLocalMap 與 Java 中的 Map 集合沒有任何關聯 , 該類就是為了保存 線程本地變量而在 ThreadLocal 中設置的內部類 ; 在該 ThreadLocalMap 內部類中 , 通過 key 鍵 , 獲取對應 value 值 ;

public class ThreadLocal<T> {/*** 返回 該線程本地變量的 當前線程的變量副本.* 如果 該線程中對應的 變量沒有值, 應該首先初始化該變量值** @return 返回當前線程的線程本地變量值 */public T get() {// 首先通過 Thread 拿到當前的線程 Thread t = Thread.currentThread();// 通過當前線程 , 獲取當前線程的 ThreadLocalMap ThreadLocalMap map = getMap(t);if (map != null) {// 通過 key 獲取指定的 valueThreadLocalMap.Entry e = map.getEntry(this);if (e != null) {@SuppressWarnings("unchecked")T result = (T)e.value;return result;}}return setInitialValue();} }

3 . ThreadLocal 變量設置 : 調用 ThreadLocal 的 put() 方法 , 可以設置 線程本地變量 ;



4 . Looper 中關于 線程本地變量 的設置 : 在 Looper 中涉及到了 線程本地變量 的設置 ,

Looper 要求每個線程只能保持一個 , 并且各個線程之間的 Looper 相互獨立 , 沒有任何關聯 ;

這就需要 將 Looper 定義成線程本地變量 ;

public class Looper {/*** 一個線程只能有一個 Looper* 使用 ThreadLocal 來保存該 Looper* 是線程內部存儲類 , 只能本線程才可以得到存儲的數據 ;*/static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<>();/*** 準備 Looper 方法* 其中* 使用了 sThreadLocal.get() 獲取線程本地變量 * 使用了 sThreadLocal.set(new Looper()) 設置線程本地變量 */public static void prepare(){// 先進行判斷 , 如果當前線程已經有了 Looper , 那就拋出異常if(sThreadLocal.get() != null){throw new RuntimeException("當前線程已存在 Looper");}// 如果不存在 Looper , 就創建一個 LoopersThreadLocal.set(new Looper());}



三、Looper 中的消息隊列 MessageQueue



在 Looper 中首先要維護一個 ThreadLocal 線程本地變量 , 確保每個線程中都可以獲取到一個該變量的獨立副本 ;

維護消息隊列 : 每個 Looper 中還要維護一個 MessageQueue 消息隊列 , 用于存儲從 Handler 中發送來的消息 ;

該消息隊列 在 Looper 初始化時創建 ;

package kim.hsl.handler;public class Looper {/*** 一個線程只能有一個 Looper* 使用 ThreadLocal 來保存該 Looper* 是線程內部存儲類 , 只能本線程才可以得到存儲的數據 ;*/static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<>();/*** 消息隊列*/public MessageQueue mQueue;/*** Looper 構造函數*/private Looper(){mQueue = new MessageQueue();}/*** 獲取當前線程對應的 Looper* @return*/public static Looper looper(){return sThreadLocal.get();}/*** 準備 Looper 方法*/public static void prepare(){// 先進行判斷 , 如果當前線程已經有了 Looper , 那就拋出異常if(sThreadLocal.get() != null){throw new RuntimeException("當前線程已存在 Looper");}// 如果不存在 Looper , 就創建一個 LoopersThreadLocal.set(new Looper());}}

總結

以上是生活随笔為你收集整理的【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )的全部內容,希望文章能夠幫你解決所遇到的問題。

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