Handler機制 Looper原始碼解析

2021-09-22 21:41:53 字數 2886 閱讀 8708

安卓中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...