天天看點

【Android開發】線程與消息處理-Handler消息傳遞機制之Looper

在前面已經介紹了在android中如何建立、開啟、休眠和中斷線程。不過,此時并沒有在新建立的子線程中對ui界面上的内容進行操作,如果應用前面介紹的方法對ui界面進行操作,将抛出異常。

為此,android中引入了handler消息傳遞機制,來實作在新建立的線程中操作ui界面。下面将對handler消息傳遞機制進行介紹。

1.循環者looper介紹

在介紹looper之前,需要先了解一下messagequeue的概念。在android中,一個線程對應一個looper對象,而一個looper對象又對應一個messagequeue(消息隊列)。messagequeue用于存放message(消息),在messagequeue中,存放的消息按照fifo(先進先出)原則執行,由于messagequeue被封裝到looper裡面,是以這裡不對messagequeue進行過多介紹。

looper對象用來為一個線程開啟一個循環消息,進而操作messagequeue。預設情況下,android中新建立的線程時沒有開啟消息循環的,但是主線程除外。系統自動為主線程建立looper對象,開啟消息循環。是以,當在主線程中應用下面的代碼建立handler對象時不會出錯,而如果在新建立的非主線程中建立handler對象,将産生java.lang.runtimeexception:can't create handle inside thread that has not called looper.prepare()的異常資訊。

handler handler2=new handler();

如果想要在非主線程中建立handler對象,首先需要使用looper類的prepare()方法來初始化一個looper對象,然後建立該handler對象,再使用looper類的loop()方法啟動looper,從消息隊列中擷取和處理消息。

執行個體:建立一個繼承thread類的looperthread,并在重寫的run()方法中建立一個handler對象,發送并處理消息。

運作執行個體,在日志面闆(logcat)上輸出如圖中所示的内容

【Android開發】線程與消息處理-Handler消息傳遞機制之Looper

looper類常用的方法如表所示:

prepare()用于初始化looper

loop()啟動looper線程,線程會從消息隊列裡擷取和處理消息。

mylooper()可以擷取目前線程的looper對象

getthread()用于擷取looper對象所屬的線程

quit()用于結束looper循環

*注意looper.loop()之後的代碼不會被執行,因為該函數内部是一個循環。隻有調用handler.getlooper.quit()方法之後,loop()方法才會終止,其後面的代碼才能運作。

轉載請注明出處:http://blog.csdn.net/acmman/article/details/46352863

繼續閱讀