成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

移動開發 Android
我們知道了HandlerThread?類其實就是一個Thread,start()?方法內部調用的肯定是Thread的run?方法,我們查看一下其run方法的具體實現。

HandlerThread是Android開發中用于啟動具有Looper的新線程的線程類,內部包含一個Looper和一個Handler,可以方便地發送和處理消息。通過在HandlerThread中處理任務,并通過Handler將結果發送回主線程,可以實現線程間的數據傳遞和交互。

原理解析

通過調用HandlerThread的構造函數并傳入一個字符串作為線程名創建HandlerThread實例。

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

HandlerThread繼承于Thread,本質上是一個線程,其構造方法主要是做一些初始化的操作。

我們知道了HandlerThread類其實就是一個Thread,start()方法內部調用的肯定是Thread的run方法,我們查看一下其run方法的具體實現。

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

內部調用了Looper.prepate()方法和Loop.loop()方法,熟悉Android異步消息機制知道,在Android體系中是對應著Looper對象、MessageQueue對象,以及Handler對象。

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

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

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

我們使用時需要初始化Handler實例:

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

Handler的構造方法中傳入了HandlerThread的Looper對象,所以Handler對象就擁有了HandlerThread線程中Looper對象的引用。調用Handler的sendMessage方法發送消息,在Handler的handleMessge方法中就可以接收到消息。

基本用法

  1. 創建HandlerThread實例

通過調用HandlerThread的構造函數并傳入一個字符串作為線程名創建HandlerThread實例。

HandlerThread handlerThread = new HandlerThread("mHandlerThread");

"mHandlerThread"是線程的名字。

  1. 啟動HandlerThread

在創建HandlerThread實例后,需要調用start()方法來啟動線程。

handlerThread.start();
  1. 獲取Handler

HandlerThread啟動后,通過調用getLooper()方法并將其傳遞給Handler的構造函數來獲取一個與HandlerThread關聯的Handler實例,用于在HandlerThread中發送和處理消息。

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

使用上一步中創建的Handler實例發送消息到HandlerThread。

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

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

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

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

  1. 停止HandlerThread

通過調用Handler的quit()或quitSafely()方法來停止消息循環。HandlerThread在完成當前消息處理后終止。

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

2023-02-28 09:07:18

ChatGPTAI

2021-07-05 07:51:43

JVM底層Python

2019-12-06 10:59:20

JavaScript運行引擎

2021-07-12 09:45:36

NameServer 核心Conusmer

2021-01-12 14:46:34

Kubernetes開發存儲

2024-08-14 18:18:47

2021-12-01 18:36:35

屬性

2023-08-11 07:44:40

TCP滑動窗口數據

2020-05-21 13:25:43

Spring組件架構

2021-05-14 06:15:48

SpringAware接口

2010-09-08 11:39:01

藍牙協議棧語音網關

2010-07-06 10:07:10

jQueryJSON

2015-07-01 13:34:22

Kubernetes應用部署模型

2021-06-16 15:18:03

鴻蒙HarmonyOS應用

2023-11-16 09:01:37

Hadoop數據庫

2015-08-19 10:36:24

Zigbee技術無線通信

2015-08-18 09:40:32

OpenStack Neutron虛擬網絡

2021-04-13 07:58:36

測試假設檢驗

2016-10-21 11:04:07

JavaScript異步編程原理解析

2024-08-27 12:32:32

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜噜噜噜 | 亚洲高清在线观看 | 玖玖精品 | 久久精品 | 成年人黄色一级毛片 | 免费毛片网站在线观看 | 欧美va大片 | 日韩精品不卡 | 久久久久久国产 | 亚洲精品视频一区 | 视频在线观看一区二区 | 91久久网站 | 午夜精品久久久久久不卡欧美一级 | 蜜桃精品视频在线 | 亚洲理论在线观看电影 | 久久亚洲一区二区 | 免费黄色片在线观看 | 91麻豆精品国产91久久久久久 | www国产成人免费观看视频,深夜成人网 | 国产日韩欧美一区 | 亚洲精品久久久久久久久久久 | 国产精品久久久久久久久久久免费看 | 色接久久 | 欧美久久精品一级黑人c片 91免费在线视频 | 国产yw851.c免费观看网站 | 午夜影院 | 欧美日韩国产传媒 | 久久精品亚洲精品 | 日韩欧美国产成人一区二区 | 九九热九九 | 亚洲欧美一区在线 | 91免费高清 | 欧美日韩视频在线第一区 | 成人免费福利 | 亚洲 中文 欧美 | 一区二区三区四区av | 国产欧美一区二区三区国产幕精品 | 人人射人人草 | 色综合视频 | 天天操 夜夜操 | 久久久久国 |