安卓中handler框架處理訊息,其中looper類用來迴圈從messagequeue類中獲取訊息,然後呼叫handler進行消費.本文將基於安卓9.0**帶分析looper的實現.
looper模擬較簡單,其主要類成員變數比較少.
//構造方法是私有的,一般會有靜態方法來常見例項.
private
looper
(boolean quitallowed)
在looper中構造方法中,首先建立了訊息佇列messagequeue例項儲存到了成員變數mqueue中,其次將當前執行緒例項存放到mthead成員變數中,完成looper和執行緒的繫結.
該構造方法有乙個引數:quitallowed,表示該looper是否可以提出,通過後面的**分析可以看到主線程的looper是不認不能退出的,其他執行緒的looper是可以退出的.
looper只有乙個私有的構造方法,所以不允許直接通過new方法建立乙個looper例項,需要通過looper的提供的靜態工廠方法建立例項.
looper類中提供了三個靜態工廠方法, 建立looper例項.
//建立looper.
private
static
void
prepare
(boolean quitallowed)
//直接newlooper的例項,並將looper儲存到本地變數中.
sthreadlocal.
set(
newlooper
(quitallowed));
}
在該方法中建立looper例項,在建立以前呼叫sthreadlocal.get()
獲取當前執行緒的looper,如果獲取到就丟擲異常"only one looper may be created per thread"
,該異常說明乙個執行緒只能建立乙個looper,不能重複建立.
sthreadlocal.set(new looper(quitallowed));
表明將建立的looper例項儲存到sthreadlocal中,從而保證每個執行緒的looper不被覆蓋.
//主線程的looper不能退出的,只能建立一次,並且建立後儲存到
public
static
void
preparemainlooper()
//將主線程的looper的儲存到靜態成員變數smainlooper,方便在其他執行緒中獲取主線程的looper.
smainlooper =
mylooper()
;}}
建立主線程looper的時候呼叫prepare(false);
建立,傳入的引數為false,說明不能退出.將建立好的looper例項儲存到smainlooper成員變數中.
public
final
class
activitythread
extends
clienttransactionhandler
//啟動looper的死迴圈
looper.
loop()
;}}
//子執行緒的建立的looper都是可以退出的.
public
static
void
prepare()
通過呼叫prepare(true)
方法在子執行緒中建立looper例項,引數為true,表明子執行緒建立的looper可以退出的.
public
static
@nullable looper mylooper()
在主線程中,直接呼叫looper.mylooper()方法返回的就是主線程的looper.
在其他執行緒中,需要使用looper.getmainlooper()方法獲取主線程的looper.
所以一直建議使用looper.getmainlooper()方法獲取主程序的looper.
public
static looper getmainlooper()
}
下面是loop()**,刪掉大量和核心邏輯無關的**.
public
static
void
loop()
//獲取當前looper關聯的messagequeue
final messagequeue queue = me.mqueue;
//建立死迴圈獲取訊息.
for(;;
)...
//呼叫handler的dispatchmessage方法處理訊息.
tryfinally..
. msg.
recycleunchecked()
;}}
looper建立了乙個死迴圈,從mqueue獲取訊息,獲取到後呼叫handler進行處理,如果獲取的訊息為null就退出looper.
looper類提供了兩個方法quit()和quitsafely()來退出looper,通過方法名字就可以看出乙個安全退出的,乙個是非安全退出.
public
void
quit()
呼叫該方法後,直接終止looper,不處理任何的message.
public
void
quitsafely()
呼叫該方法可以安全退出looper,它處理完所有的訊息後在終止,呼叫該方法後不能在把messag放到訊息佇列中. Handler機制 4 Looper簡介
四 looper 概述looper可以說是handler機制中的乙個非常重要的核心。looper相當於執行緒訊息機制的引擎,驅動整個訊息機制執行。looper負責從佇列中取出訊息,然後交給對應的handler去處理。如果佇列中沒有訊息,則messagequeue的next方法會阻塞執行緒,等待新的訊...
android訊息機制 Looper
looper在android的訊息機制充當訊息迴圈的角色,它不停的充messagequeue中拿出訊息,並將訊息交給hanlder處理,下面是他的常用方法解析。專案原始碼 1.android主線程在建立的時候會主動建立乙個looper activitythread是android的主線程,在該類的m...
從原始碼看Handler和Looper
private looper boolean quitallowed public handler looper looper,callback callback,boolean async public inte ce callback從looper的構造方法可以看出,looper建立messag...