2023年1月30日 13:51:32 晴
handler機制詳解
handler機制
而looper類中 looper.preparemainlooper();方法呼叫的是
publicstatic
final
void
prepare()
sthreadlocal.set(
newlooper());
}
從執行緒級共享物件中設定乙個looper物件,如果這個物件已經被建立過,則丟擲異常
接下來回到activitythread接著看它的main方法
接下來有一行**
looper.loop();
looper類中
publicstatic
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()**;
publicstatic
final
looper mylooper()
從執行緒級共享物件中獲取looper.preparemainlooper()
存入的looper物件,而且因為上面的乙個判斷,所以每個介面取出來的looper都是相同的;
這裡實現了多個activity取得都是同乙個looper
主線程activitythread中還有乙個點 就是它的handler是它自己自定義的
privatefinal
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,訊息處理物件以及...