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

歡迎訪問 生活随笔!

生活随笔

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

Android

【Android 异步操作】HandlerThread 示例 ( 初始化并执行 | 获取Looper | 获取 Handler | 获取消息队列 | 设置空闲队列 | 代码示例 )

發(fā)布時(shí)間:2025/6/17 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 异步操作】HandlerThread 示例 ( 初始化并执行 | 获取Looper | 获取 Handler | 获取消息队列 | 设置空闲队列 | 代码示例 ) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、HandlerThread 初始化
  • 二、HandlerThread 獲取Looper
  • 三、HandlerThread 獲取消息隊(duì)列 MessageQueue
  • 四、HandlerThread 獲取 Handler
  • 五、HandlerThread 設(shè)置空閑隊(duì)列
  • 六、HandlerThread 代碼示例





一、HandlerThread 初始化



初始化 HandlerThread , 特別注意 , 初始化完成后 , 緊跟著調(diào)用該線程的 start() 方法啟動(dòng) ;

只有啟動(dòng)后 , HandlerThread 才會(huì) 初始化 Looper ,

Looper 初始化完成后 , 才能創(chuàng)建其中的 MessageQueue 消息隊(duì)列 ,

有了 消息隊(duì)列 MessageQueue , 才能獲取 Handler ,

調(diào)用 getThreadHandler 方法獲取 Handler , 或 自己創(chuàng)建 Handler ;

// 1 . 初始化, 之后馬上啟動(dòng)handlerThread = HandlerThread("handler")handlerThread.start()

HandlerThread -> Looper -> MessageQueue -> Handler





二、HandlerThread 獲取Looper



HandlerThread 獲取 Looper , 必須在 HandlerThread 啟動(dòng)之后 , 才能獲取 Looper ;

// 2 . 獲取 Looperlooper = handlerThread.looper



三、HandlerThread 獲取消息隊(duì)列 MessageQueue



HandlerThread 獲取 MessageQueue , 從 Looper 中獲取其中的 MessageQueue 消息隊(duì)列 ,

在 6.0 之后 , 可以直接調(diào)用 getQueue 方法 , 獲取消息隊(duì)列 ,

在 6.0 之前 , 使用 反射 , 獲取 Looper 中的 MessageQueue 消息隊(duì)列 ;

// 3 . 獲取 消息隊(duì)列 MessageQueueif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {messageQueue = looper.queue}else{// 反射獲取 MessageQueue 消息隊(duì)列// 設(shè)置訪問字段var mQueue = Looper::class.java.getDeclaredField("mQueue")// 設(shè)置允許訪問mQueue.isAccessible = truemessageQueue = mQueue.get(looper) as MessageQueue}



四、HandlerThread 獲取 Handler



創(chuàng)建 Handler , 可以通過上述獲取的 子線程 Looper 創(chuàng)建 Handler , 將該 Looper 作為參數(shù) , 傳入 Handler 構(gòu)造函數(shù) , 即可創(chuàng)建該子線程對應(yīng)的 Handler ;

該 Handler 運(yùn)行在子線程中 , 因?yàn)樵?Looper 是在子線程中 ;

// 5 . 初始化 Handlerhandler = Handler(looper, {msg: Message ->Log.i(TAG, "運(yùn)行任務(wù) ${msg.what}")true})



五、HandlerThread 設(shè)置空閑隊(duì)列



MessageQueue 消息隊(duì)列 設(shè)置 IdleHandler 空閑任務(wù) ,

IdleHandler 空閑任務(wù)實(shí)現(xiàn) , 實(shí)現(xiàn)該 IdleHandler 接口的 queueIdle 方法 , 返回 true , 每次空閑時(shí)都會(huì)回調(diào) , 如果返回 false , 則只會(huì)回調(diào)一次 ;

注冊 IdleHandler , 調(diào)用 MessageQueue 消息隊(duì)列的 addIdleHandler 注冊空閑任務(wù) ,

注銷 IdleHandler , 調(diào)用 MessageQueue 消息隊(duì)列的 removeIdleHandler 注銷空閑任務(wù)





六、HandlerThread 代碼示例



HandlerThread 代碼示例 :

創(chuàng)建 HandlerThread , 注意創(chuàng)建后馬上調(diào)用 start 方法執(zhí)行 ,

獲取對應(yīng)的 Looper ,

獲取 Looper 中封裝的 消息隊(duì)列 MessageQueue , 6.0 之后直接調(diào)用 getQueue 獲取 , 6.0 之前使用反射獲取 ,

設(shè)置空閑任務(wù) IdleHandler , ( 可選 ) , 該空閑任務(wù)在 MessageQueue 隊(duì)列為空時(shí)調(diào)用 , 一般用于刷新數(shù)據(jù) , UI 等操作 ,

初始化 Handler , 可以自己創(chuàng)建 , 傳入 Looper , 也可以調(diào)用 getLooper 方法獲取系統(tǒng)提供的 Handler ,

使用 Handler 發(fā)送消息 ;

package kim.hsl.handlerimport android.os.* import android.os.Handler import android.os.Looper import android.os.Message import android.os.MessageQueue import android.util.Log import androidx.appcompat.app.AppCompatActivity import kotlin.concurrent.threadclass MainActivity : AppCompatActivity() {val TAG = "MainActivity"lateinit var handlerThread : HandlerThread;lateinit var looper : Looperlateinit var messageQueue : MessageQueuelateinit var handler : Handleroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)handler()}fun handler(){// 1 . 初始化, 之后馬上啟動(dòng)handlerThread = HandlerThread("handler")handlerThread.start()// 2 . 獲取 Looperlooper = handlerThread.looper// 3 . 獲取 消息隊(duì)列 MessageQueueif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {messageQueue = looper.queue}else{// 反射獲取 MessageQueue 消息隊(duì)列// 設(shè)置訪問字段var mQueue = Looper::class.java.getDeclaredField("mQueue")// 設(shè)置允許訪問mQueue.isAccessible = truemessageQueue = mQueue.get(looper) as MessageQueue}// 4 . 注冊 IdleHandlermessageQueue.addIdleHandler {Log.i(TAG, "空閑任務(wù)")// 注意這里返回 true, 表示每次空閑任務(wù)都執(zhí)行一次true}// 5 . 初始化 Handlerhandler = Handler(looper, {msg: Message ->Log.i(TAG, "運(yùn)行任務(wù) ${msg.what}")true})// 6 . 子線程中發(fā)送消息 0thread (start = true) {handler.sendEmptyMessage(0)}// 7 . 主線程發(fā)送消息 1handler.sendEmptyMessage(1)}}

運(yùn)行結(jié)果 :

總結(jié)

以上是生活随笔為你收集整理的【Android 异步操作】HandlerThread 示例 ( 初始化并执行 | 获取Looper | 获取 Handler | 获取消息队列 | 设置空闲队列 | 代码示例 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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