handler機制詳解

2022-08-03 19:15:16 字數 4391 閱讀 4164

2023年1月30日 13:51:32     晴

handler機制詳解

handler機制

而looper類中  looper.preparemainlooper();方法呼叫的是

public

static

final

void

prepare()

sthreadlocal.set(

newlooper());

}

從執行緒級共享物件中設定乙個looper物件,如果這個物件已經被建立過,則丟擲異常

接下來回到activitythread接著看它的main方法

接下來有一行**

looper.loop();

looper類中

public

static

final

void

loop()

if (msg != null

) if (me.mlogging!= null

) me.mlogging.println(

">>>>> dispatching to " + msg.target + " "

+ msg.callback + ": " +msg.what

);msg.target.dispatchmessage(msg);

if (me.mlogging!= null

) me.mlogging.println(

"<<<<< finished to " + msg.target + " "

+msg.callback);

msg.recycle();}}

}

還是看它的第一行

looper me = mylooper();

接著往下看  mylooper()**;

public

static

final

looper mylooper()

從執行緒級共享物件中獲取looper.preparemainlooper()

存入的looper物件,而且因為上面的乙個判斷,所以每個介面取出來的looper都是相同的;

這裡實現了多個activity取得都是同乙個looper

主線程activitythread中還有乙個點 就是它的handler是它自己自定義的

private

final

class h extends

handler {

public

static

final

int launch_activity = 100;

public

static

final

int pause_activity = 101;

public

static

final

int pause_activity_finishing= 102;

public

static

final

int stop_activity_show = 103;

public

static

final

int stop_activity_hide = 104;

public

static

final

int show_window = 105;

public

static

final

int hide_window = 106;

public

static

final

int resume_activity = 107;

public

static

final

int send_result = 108;

public

static

final

int destroy_activity = 109;

public

static

final

public

static

final

public

static

final

int new_intent = 112;

public

static

final

int receiver = 113;

public

static

final

int create_service = 114;

public

static

final

int service_args = 115;

public

static

final

int stop_service = 116;

public

static

final

int request_thumbnail = 117;

public

static

final

int configuration_changed = 118;

public

static

final

int clean_up_context = 119;

public

static

final

int gc_when_idle = 120;

public

static

final

int bind_service = 121;

public

static

final

int unbind_service = 122;

public

static

final

int dump_service = 123;

public

static

final

int low_memory = 124;

public

static

final

int activity_configuration_changed = 125;

public

static

final

int relaunch_activity = 126;

public

static

final

int profiler_control = 127;

public

static

final

int create_backup_agent = 128;

public

static

final

int destroy_backup_agent = 129;

public

static

final

int suicide = 130;

public

static

final

int remove_provider = 131;

public

static

final

int enable_jit = 132;

public

static

final

int dispatch_package_broadcast = 133;

public

static

final

int schedule_crash = 134;

我們可以看懂很多的狀態,當狀態改變時傳送不同message的h訊息,從而進行相應的處理

最終總結

先activitythread被activitymanager建立,然往threadlocal裡面存乙個建立的looper,接下來執行loop 一直阻塞操作更新ui和生命週期,使用者點選後發訊息時,呼叫的是sendmessageattime()方法,然後被放入到訊息佇列messagequeue中,等待looper去next獲取,當獲取到了時候,looper呼叫的msg.target的dispatchmessage方法,這個target指的就是與之對應的handler,最後呼叫的handler的handemessage方法,實現多執行緒之間的通訊

子執行緒中可以有handler,但是必須有乙個與之對應的looper,呼叫looper.prepare來初始化乙個looper,其中在它的建構函式中已經建立了乙個與之對應的訊息佇列messagequeue,然後呼叫looper.loop在子執行緒中開啟輪詢,即可實現子執行緒自己的訊息佇列,這點有些類似於執行緒池

handler通訊機制

android應用開發有個預設規則,不在ui執行緒做耗時操作。耗時操作結果反饋給使用者也不能直接更新ui。耗時操作必須開子執行緒去做,實現的方式很多,handler asynctask service。每個人偏好不同,但是各有各的優點,根據不同的需求選擇適當的實現方式,是我一直追求的目標,每一種至少...

Handler機制概要

簡而言之,每個thread裡面有looper 通過prepare初始化,通過loop進入死迴圈 每個handler將自己的msg放入looper死迴圈裡面,然後looper迴圈檢測訊息再傳送回給handler。記憶體洩漏問題 這裡需要注意乙個記憶體洩漏問題,就是當activity退出的時候會出現記憶...

Handler機制整理

handler機制整理 目錄介紹 1.關於handler訊息機制圖 2.關於handler基本介紹 3.使用handler的幾種方法 4.關於handler底層原始碼解讀 1.關於handler訊息機制圖 2.關於handler機制基本解讀 message 訊息,其中包含了訊息id,訊息處理物件以及...