自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

原理解析 | Android中HandlerThread原理和使用

移動(dòng)開發(fā) Android
我們知道了HandlerThread?類其實(shí)就是一個(gè)Thread,start()?方法內(nèi)部調(diào)用的肯定是Thread的run?方法,我們查看一下其run方法的具體實(shí)現(xiàn)。

HandlerThread是Android開發(fā)中用于啟動(dòng)具有Looper的新線程的線程類,內(nèi)部包含一個(gè)Looper和一個(gè)Handler,可以方便地發(fā)送和處理消息。通過在HandlerThread中處理任務(wù),并通過Handler將結(jié)果發(fā)送回主線程,可以實(shí)現(xiàn)線程間的數(shù)據(jù)傳遞和交互。

原理解析

通過調(diào)用HandlerThread的構(gòu)造函數(shù)并傳入一個(gè)字符串作為線程名創(chuàng)建HandlerThread實(shí)例。

public HandlerThread(String name) {
    super(name);
    mPriority = Process.THREAD_PRIORITY_DEFAULT;
}

HandlerThread繼承于Thread,本質(zhì)上是一個(gè)線程,其構(gòu)造方法主要是做一些初始化的操作。

我們知道了HandlerThread類其實(shí)就是一個(gè)Thread,start()方法內(nèi)部調(diào)用的肯定是Thread的run方法,我們查看一下其run方法的具體實(shí)現(xiàn)。

@Override
public void run() {
    mTid = Process.myTid();
    Looper.prepare();
    synchronized (this) {
        mLooper = Looper.myLooper();
        notifyAll();
    }
    Process.setThreadPriority(mPriority);
    onLooperPrepared();
    Looper.loop();
    mTid = -1;
}

內(nèi)部調(diào)用了Looper.prepate()方法和Loop.loop()方法,熟悉Android異步消息機(jī)制知道,在Android體系中是對(duì)應(yīng)著Looper對(duì)象、MessageQueue對(duì)象,以及Handler對(duì)象。

所以通過run方法,我們可以知道在我們創(chuàng)建的HandlerThread線程中我們創(chuàng)建了該線程的Looper與MessageQueue。

這里需要注意的是其在調(diào)用Looper.loop()方法之前調(diào)用了一個(gè)空的實(shí)現(xiàn)方法onLooperPrepared(),我們可以實(shí)現(xiàn)自己的onLooperPrepared方法做一些Looper的初始化操作;

run方法里面當(dāng)mLooper創(chuàng)建完成后有個(gè)notifyAll(),getLooper()中有個(gè)wait()。因?yàn)閙Looper在一個(gè)線程中執(zhí)行,而我們的Handler是在UI線程初始化的,也就是說(shuō),我們必須等到mLooper創(chuàng)建完成,才能正確的返回getLooper()。wait()``notify()就是為了解決這兩個(gè)線程的同步問題。

我們使用時(shí)需要初始化Handler實(shí)例:

Handler handler = new Handler(handlerThread.getLooper()) {
    @Override
    public void handleMessage(Message msg) {
        // 處理消息
        Log.i("HandlerThread", "接收到消息:" + msg.obj.toString());
    }
};

Handler的構(gòu)造方法中傳入了HandlerThread的Looper對(duì)象,所以Handler對(duì)象就擁有了HandlerThread線程中Looper對(duì)象的引用。調(diào)用Handler的sendMessage方法發(fā)送消息,在Handler的handleMessge方法中就可以接收到消息。

基本用法

  1. 創(chuàng)建HandlerThread實(shí)例

通過調(diào)用HandlerThread的構(gòu)造函數(shù)并傳入一個(gè)字符串作為線程名創(chuàng)建HandlerThread實(shí)例。

HandlerThread handlerThread = new HandlerThread("mHandlerThread");

"mHandlerThread"是線程的名字。

  1. 啟動(dòng)HandlerThread

在創(chuàng)建HandlerThread實(shí)例后,需要調(diào)用start()方法來(lái)啟動(dòng)線程。

handlerThread.start();
  1. 獲取Handler

HandlerThread啟動(dòng)后,通過調(diào)用getLooper()方法并將其傳遞給Handler的構(gòu)造函數(shù)來(lái)獲取一個(gè)與HandlerThread關(guān)聯(lián)的Handler實(shí)例,用于在HandlerThread中發(fā)送和處理消息。

Handler handler = new Handler(handlerThread.getLooper()) {
    @Override
    public void handleMessage(Message msg) {
        // 處理消息
        Log.i("HandlerThread", "接收到消息:" + msg.obj.toString());
    }
};
  1. 發(fā)送消息到HandlerThread

使用上一步中創(chuàng)建的Handler實(shí)例發(fā)送消息到HandlerThread。

// 使用sendMessage()方法發(fā)送消息
Message message = Message.obtain();
message.obj = "111111";
handler.sendMessage(message);

message = Message.obtain();
message.obj = "222222";
handler.sendMessage(message);

// 或者使用post()方法發(fā)送Runnable對(duì)象
handler.post(new Runnable() {
    @Override
    public void run() {
        Log.i("HandlerThread", "執(zhí)行Runnable的run方法");
    }
});
  1. 處理消息

在Handler的handleMessage()方法中處理從主線程或其他線程發(fā)送過來(lái)的消息。

  1. 停止HandlerThread

通過調(diào)用Handler的quit()或quitSafely()方法來(lái)停止消息循環(huán)。HandlerThread在完成當(dāng)前消息處理后終止。

handler.quit(); 
// 或者 
handler.quitSafely();
  1. 注意事項(xiàng)
  • 在HandlerThread停止后再處理與其相關(guān)的任何資源,避免潛在的內(nèi)存泄漏或其他問題。
  • HandlerThread中的任務(wù)是串行執(zhí)行的,如果某個(gè)任務(wù)執(zhí)行時(shí)間過長(zhǎng),可能會(huì)導(dǎo)致后續(xù)任務(wù)被延遲處理。
  • 注意線程安全問題,確保在多個(gè)線程之間正確地同步和共享數(shù)據(jù)。
責(zé)任編輯:武曉燕 來(lái)源: 沐雨花飛蝶
相關(guān)推薦

2023-02-28 09:07:18

ChatGPTAI

2021-07-05 07:51:43

JVM底層Python

2019-12-06 10:59:20

JavaScript運(yùn)行引擎

2021-07-12 09:45:36

NameServer 核心Conusmer

2021-01-12 14:46:34

Kubernetes開發(fā)存儲(chǔ)

2024-08-14 18:18:47

2021-05-14 06:15:48

SpringAware接口

2023-08-11 07:44:40

TCP滑動(dòng)窗口數(shù)據(jù)

2021-12-01 18:36:35

屬性

2020-05-21 13:25:43

Spring組件架構(gòu)

2010-09-08 11:39:01

藍(lán)牙協(xié)議棧語(yǔ)音網(wǎng)關(guān)

2010-07-06 10:07:10

jQueryJSON

2015-07-01 13:34:22

Kubernetes應(yīng)用部署模型

2021-06-16 15:18:03

鴻蒙HarmonyOS應(yīng)用

2015-08-18 09:40:32

OpenStack Neutron虛擬網(wǎng)絡(luò)

2023-11-16 09:01:37

Hadoop數(shù)據(jù)庫(kù)

2015-08-19 10:36:24

Zigbee技術(shù)無(wú)線通信

2021-04-13 07:58:36

測(cè)試假設(shè)檢驗(yàn)

2024-08-27 12:32:32

2016-10-21 11:04:07

JavaScript異步編程原理解析
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)