久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

AsyncQueryHandler

 dddTTLee 2011-04-18
 
 

AsyncQueryHandler研究

android 2010-11-09 00:29:52 閱讀163 評論0   字號(hào): 訂閱

今天晚上研究了一下啊AsyncQueryHandler,,收獲挺大,,記錄下重要知識(shí)點(diǎn),以后繼續(xù)補(bǔ)充研究,。

研究AsyncQueryHandler這個(gè)類的時(shí)候遇到了幾個(gè)重要的不清楚的知識(shí)點(diǎn)

1. Handler與Thread,,Looper的關(guān)系

2. HandlerThread是干什么用的

3. ThreadLocal類是干什么用的

Handler主要是用來發(fā)送和處理消息,但是發(fā)送了消息后,,消息是怎么傳遞的呢,?這就是Looper的作用了,每個(gè)Handler中都會(huì)有一個(gè)Looper對象,,如果在創(chuàng)建Handler的時(shí)候不指定,,系統(tǒng)就會(huì)默認(rèn)將當(dāng)前線程的Looper綁定到Handler上,Looper對象中維護(hù)者一個(gè)消息隊(duì)列,,Hander發(fā)送的消息都會(huì)存儲(chǔ)到這個(gè)消息隊(duì)列中,Looper不斷的遍歷這個(gè)消息隊(duì)列,,取出消息,,交給handleMessage方法處理。Looper屬于哪個(gè)線程,,hadleMessage方法就會(huì)在那個(gè)線程中執(zhí)行,。

HandlerThread不但能提供異步處理,Handler處理消息的方法也會(huì)在這個(gè)線程中執(zhí)行,,他最要的作用就是提供了一個(gè)線程,。(這個(gè)類還有待研究)

ThreadLocal類主要是用來多個(gè)模塊共享變量用的,但是不同線程之間的變量的值卻不相同,。

image

說明1:對象a,,對象b比如說是某個(gè)類的實(shí)例對象,在模塊A,B,C中共享對象a,,還有對象b,,在線程A中,模塊A中設(shè)置a的值,,在模塊B,C中取出a的值,,三個(gè)模塊操作的是同一個(gè)值,但是對象a和對象b分別屬于兩個(gè)線程,他們是不同的,。

AsyncQueryHandler的工作機(jī)制是什么,?

AsyncQueryHandler繼承了Handler對象,但是他提供的構(gòu)造方法中卻沒有Looper參數(shù),,也就是說他和他所在的當(dāng)前線程綁定,,AsyncQueryHandler內(nèi)部有一個(gè)Hhandler對象,叫mWorkerHandler,,他和一個(gè)HandlerThread綁定,,mWorkerHandler負(fù)責(zé)將打包好的消息發(fā)送,并且處理,,并將結(jié)果作為消息發(fā)送給AsyncQueryHandler,。他是怎么發(fā)送的?AsyncQueryHandler內(nèi)部有一個(gè)WorkerArgs完美類,,他封裝了startAsyncQuery等方法的參數(shù),,并且通過這行代碼

WorkerArgs args = new WorkerArgs();
       args.handler = this;

將當(dāng)前Handler封裝進(jìn)去,發(fā)送到HandlerThread中去,,mWorkerHandler處理完消息得到結(jié)果后,,args.handler將結(jié)構(gòu)發(fā)送給自己進(jìn)行處理。(這就是線程間的通信了)

mWorkerHandler和一個(gè)子線程綁定,,能夠處理比較耗時(shí)的操作,,AsyncQueryHandler提供異步處理。

 

總結(jié):

Handler有兩個(gè)作用,,Handler用在一個(gè)線程中,,就是實(shí)現(xiàn)異步操作。用在不同的線程之間,,那就是異步操作加線程間通信,。

補(bǔ)充:

HandlerThread:

先看他的類描述:Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called.

這是一個(gè)包含了Looper對象的線程,這個(gè)looper可以用來創(chuàng)建Handler對象,,記?。簊tart()方法必須被調(diào)用,否則通過getLooper方法得到的looper對象是空的,。通過調(diào)用start方法,,就會(huì)去執(zhí)行該線程的run方法, public void run() {

        mTid = Process.myTid();

        Looper.prepare();//創(chuàng)建一個(gè)Looper實(shí)例,,并且存儲(chǔ)在ThreadLocal中,,ThreadLocal中維護(hù)一個(gè)HashMap,鍵是線程號(hào)

        synchronized (this) {

            mLooper = Looper.myLooper();//得到當(dāng)前線程的Looper,,就是剛才perpare方法中創(chuàng)建并存儲(chǔ)的那個(gè)Looper實(shí)例

            Process.setThreadPriority(mPriority);

            notifyAll();

        }

        onLooperPrepared();

        Looper.loop();//開始輪詢

        mTid = -1;

    }

 public static final void prepare() {

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

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

        }

        sThreadLocal.set(new Looper());

    }

 public static final Looper myLooper() {

        return (Looper)sThreadLocal.get();

    }



AsyncQueryHandler是如何提供onxxxComplete方法給用戶,,由用戶自己實(shí)現(xiàn)的,?

public abstract class AsyncQueryHandler extends Handler  他是一個(gè)抽象類


MessageQueue是不是一個(gè)任務(wù)隊(duì)列?

是,,他是一個(gè)優(yōu)先級隊(duì)列(可以通過ArrayList的排序來實(shí)現(xiàn)),。它內(nèi)部自己維護(hù)一個(gè)ArrayLsit集合,用來存儲(chǔ)Message消息,,Message消息有三種,,普通消息,按照先發(fā)送先執(zhí)行的FIFO原則進(jìn)行,;高優(yōu)先級的消息,,這種消息會(huì)直接插在隊(duì)列的最前面,立刻執(zhí)行,;還有一種定時(shí)消息,,類似于定時(shí)任務(wù),到時(shí)間才執(zhí)行,。

Looper是如何輪詢MessageQueue的,?

當(dāng)在主線程中使用Handler的時(shí)候,不用指定Looper,,因?yàn)樵谥骶€程開啟的時(shí)候,,就已經(jīng)調(diào)用了Looper.loop()方法開始輪詢了。

擋在子線程中使用Handler的時(shí)候,,通過調(diào)用Looper的prepare方法創(chuàng)建存儲(chǔ)Looper對象,,還得調(diào)用Looper.loop()方法開啟輪詢。

當(dāng)配合HandlerThread使用Handler的時(shí)候,,HandlerThread的run方法中調(diào)用了Looper.loop()方法,。

    public static final void loop() {

        Looper me = myLooper();

        MessageQueue queue = me.mQueue;

        while (true) {

            Message msg = queue.next(); // might block

            //if (!me.mRun) {

            //    break;

            //}

            if (msg != null) {

                if (msg.target == null) {

                    // No target is a magic identifier for the quit message.

                    return;

                }

                msg.target.dispatchMessage(msg);

                msg.recycle();

            }

        }

    }

Message消息實(shí)現(xiàn)了Parcelable接口
 
 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多