真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Handler原理淺析-創(chuàng)新互聯(lián)

 理解Handler的原理首先要搞清楚什么是Looper,在我的上一篇博文中對(duì)此有專門的介紹。Looper的作用是開啟一個(gè)消息循環(huán),從MessageQueue(Message隊(duì)列,是Looper的成員變量)中循環(huán)取出消息處理。一個(gè)線程要使用Handler來處理來自其它線程的消息,這個(gè)線程必須有且僅有一個(gè)Looper對(duì)象與之綁定,也可以說一個(gè)Looper對(duì)象是是與一個(gè)線程一一對(duì)應(yīng)的。

創(chuàng)新互聯(lián)基于成都重慶香港及美國等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動(dòng)大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)四川聯(lián)通機(jī)房服務(wù)器托管報(bào)價(jià),主機(jī)托管價(jià)格性價(jià)比高,為金融證券行業(yè)服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專業(yè)成都idc公司。

   Hander有一個(gè)Looper類型的成員,在Handler的構(gòu)造函數(shù)(new Handler()或者new Handler(CallBack))中會(huì)實(shí)例化這個(gè)Handler的Looper成員,Handler()構(gòu)造函數(shù)的源碼如下:

public Handler() {

        //獲得當(dāng)前線程在 ThreadLocal 中所對(duì)應(yīng)的 Looper

        mLooper = Looper.myLooper();

        if (mLooper == null) {

            throw new RuntimeException(

                "Can't create handler inside thread that has not called Looper.prepare()"               );

        }

        mQueue = mLooper.mQueue;

        mCallback = null;

}

 在Handler構(gòu)造函數(shù)中實(shí)例化的Looper不是通過new關(guān)鍵字來實(shí)例化的,而是從Looper.myLooper()這個(gè)靜態(tài)方法中取得的。而Looper.myLooper()又是從哪來取得的Looper對(duì)象呢?這就涉及到另外一個(gè)類ThreadLocal。Looper有一個(gè)靜態(tài)變量是ThreadLocal類型的:

static final ThreadLocal sThreadLocal = new ThreadLocal();

 這個(gè)變量就是保存每一個(gè)線程和這個(gè)線程對(duì)應(yīng)的Looper。這樣設(shè)計(jì)的作用是保證每一個(gè)線程的Looper是唯一的。

每一個(gè)線程在new Handler()之前必須為這個(gè)線程創(chuàng)建Looper對(duì)象,使用Looper.prepare()方法創(chuàng)建。

Looper.prepare的源碼如下:

public static void prepare() {

        //調(diào)用此方法的線程是否在 全局變量 sThreadLocal(即Map)中存有一組以此線程為鍵的鍵值對(duì)

        if (sThreadLocal.get() != null) {

            throw new RuntimeException("Only one Looper may be created per thread");

        }

        //如果在Map中沒有存放當(dāng)前線程對(duì)應(yīng)的鍵值對(duì)當(dāng)存入

        // 一個(gè) set 操作,其實(shí)就是在 Map 中插入了一組 值,即 <調(diào)用此方法的線程,new Looper()>

        // new Looper() 時(shí),Looper的構(gòu)造函數(shù)就會(huì)實(shí)例化一個(gè) MessageQueue

        sThreadLocal.set(new Looper());

關(guān)鍵是sThreadLocal.set(new Looper());這條語句,它會(huì)把new 出來的Looper保存到ThreadLocal這個(gè)全局變量中。

有一個(gè)問題,就是為什么我們在主線程中new Handler(){...}之前不需要使用Looper.prepare()呢?因?yàn)樵谥骶€程執(zhí)行之前,android虛擬機(jī)已經(jīng)幫我們執(zhí)行了這段代碼,因此在主線程中創(chuàng)建Handler對(duì)象不需要再新建Looper對(duì)象。創(chuàng)建了Handler之后,還要使用Looper.loop()開啟消息循環(huán)來取消息。主線程也不需要這句代碼。

總結(jié):

Looper負(fù)責(zé)開啟消息循環(huán),從MessageQueue中讀取Message,由Handler負(fù)責(zé)處理讀出來的Message。

Looper和它的MessageQueue與某一個(gè)線程是一一對(duì)應(yīng)的。

使用Handler之前需要使用Looper.prepare()為當(dāng)前線程創(chuàng)建Looper對(duì)象。

使用Looper.loop()開啟消息循環(huán)。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


新聞標(biāo)題:Handler原理淺析-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://weahome.cn/article/dpedes.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部