【Android 异步操作】HandlerThread 示例 ( 初始化并执行 | 获取Looper | 获取 Handler | 获取消息队列 | 设置空闲队列 | 代码示例 )
文章目錄
- 一、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è)置訪問(wèn)字段var mQueue = Looper::class.java.getDeclaredField("mQueue")// 設(shè)置允許訪問(wèn)mQueue.isAccessible = truemessageQueue = mQueue.get(looper) as MessageQueue}四、HandlerThread 獲取 Handler
創(chuàng)建 Handler , 可以通過(guò)上述獲取的 子線程 Looper 創(chuàng)建 Handler , 將該 Looper 作為參數(shù) , 傳入 Handler 構(gòu)造函數(shù) , 即可創(chuàng)建該子線程對(duì)應(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)一次 ;
注冊(cè) IdleHandler , 調(diào)用 MessageQueue 消息隊(duì)列的 addIdleHandler 注冊(cè)空閑任務(wù) ,
注銷 IdleHandler , 調(diào)用 MessageQueue 消息隊(duì)列的 removeIdleHandler 注銷空閑任務(wù)
六、HandlerThread 代碼示例
HandlerThread 代碼示例 :
創(chuàng)建 HandlerThread , 注意創(chuàng)建后馬上調(diào)用 start 方法執(zhí)行 ,
獲取對(duì)應(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è)置訪問(wèn)字段var mQueue = Looper::class.java.getDeclaredField("mQueue")// 設(shè)置允許訪問(wèn)mQueue.isAccessible = truemessageQueue = mQueue.get(looper) as MessageQueue}// 4 . 注冊(cè) 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 | 获取消息队列 | 设置空闲队列 | 代码示例 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Android 异步操作】Handle
- 下一篇: 【Android 安全】DEX 加密 (