android系統出於系統優化的原因,ui執行緒操作並不是執行緒安全的,這意味著如果多執行緒併發操作ui元件,則可能導致執行緒執行緒安全。所以為了解決這個問題,android制定了一條規則:只允許ui執行緒修改activity裡的ui元件。
當乙個程式啟動第一次啟動時,android會同時啟動一條主線程(main thread),主線程負責處理與ui相關的事件,並把相關的事件分發到對應的元件進行處理,所以主線程又稱ui執行緒
handler類簡介
handler類的主要倆個作用:
1.在新啟動的執行緒中傳送訊息
2.在主線程中獲取,處理訊息
handler類包含常用的用於傳送,處理訊息。
void handlemessage(message msg):處理訊息的方法,需要被重寫
final boolean hasmessage(int what):檢查訊息佇列中是否包含what屬性未指定值的訊息
final boolean hasmessage(int what ,object object):檢查訊息佇列中是否包含what屬性並且object屬性的訊息
message obtainmessage():多個過載,獲取訊息
final boolean sendemptymessagedelayed(int what,long delaymillis):指定多少毫秒後傳送空訊息
final boolean sendmessage(message msg):立即傳送訊息
final boolean sendmessagedelay(message msg,long delaymillis):指定多少毫秒後傳送訊息
handler,loop,messagequeue的工作原理:
message:handler接收和處理的訊息物件
looper:每個執行緒只能擁有乙個looper,負責讀取messagequeue中的訊息,讀到訊息之後交給傳送該訊息的handler進行處理
messagequeue:訊息佇列,採用先進先出的管理方式來管理message。建立looper物件時,會在它的構造器中建立messagequeue物件。
looper的構造器原始碼:
private looper()
為了保證保證每個執行緒中最多只有乙個looper物件。所以可以使用prepare()方法,碼源如下:
public static final void prepare()
接下來就可以呼叫looper的靜態loop()方法來啟動它。loop()方法是個死迴圈不斷地1取出小,並交給對應的handler進行處理。
for(;;)
final long newident =binder.clearcallingidentity();
if(ident !=newident)
msg.recycle();
}使用步驟:
呼叫looper的preapare()為當前執行緒建立訊息管理佇列
有了looper之後,建立handler子類的例項,重寫handlemessage()方法,處理來自其他執行緒的訊息
呼叫looper的loop()方法啟動looper
Android事件傳遞機制分析
一 android最基本的螢幕操控事件 down 按下事件。move 移動事件。up 離開事件。二 在總結的事件傳遞機制時,先介紹一下viewgroup與 view有關事件傳遞的方法 viewgroup有 dispatchtouchevent onintercepttouchevent ontouc...
訊息傳遞機制
objc msgsend函式 在oc語言裡面,訊息在執行時會繫結為 c語言 方法。編譯器會轉化乙個訊息表示式 receiver selector 任何在訊息中傳遞的引數也會被objc msgsend函式處理 objc msgsend receiver,selector,arg1,arg2,訊息傳遞函...
Android 訊息傳遞
在建立handler時,handler在其構造方法中 嘗試從當前執行緒 建立hanlder例項物件的執行緒 的threadlocal中取到looper物件 並將該looper物件賦值給當前hanlder物件,同時還會將looper物件的messagequeue引用賦值給當前handler。publi...