<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                我們以Looper使用的一個常見例子來分析Looper類。 **例子1** ~~~ //定義一個LooperThread class LooperThread extends Thread { publicHandler mHandler; public void run() { //① 調用prepare Looper.prepare(); ...... //② 進入消息循環 Looper.loop(); } } //應用程序使用LooperThread { ...... newLooperThread().start();//啟動新線程,線程函數是run } ~~~ 上面的代碼一共有兩個關鍵調用,我們對其逐一進行分析。 1. 準備好了嗎? 第一個調用函數是Looper的prepare函數。它會做什么工作呢?其代碼如下所示: **Looper.java** ~~~ publicstatic final void prepare() { //一個Looper只能調用一次prepare if(sThreadLocal.get() != null) { thrownew RuntimeException("Only one Looper may be created per thread"); } //構造一個Looper對象,設置到調用線程的局部變量中 sThreadLocal.set(newLooper()); } //sThreadLocal定義 private static final ThreadLocal sThreadLocal =new ThreadLocal(); ~~~ ThreadLocal是Java中的線程局部變量類,全名應該是Thread Local Variable。我覺得,它的實現和操作系統提供的線程本地存儲(TLS)有關系。總之,該類有兩個關鍵函數: - set:設置調用線程的局部變量。 - get:獲取調用線程的局部變量。 * * * * * **注意**,set/get的結果都和調用這個函數的線程有關。ThreadLocal類可參考JDK API文檔或Android API文檔。 * * * * * 根據上面的分析可知,prepare會在調用線程的局部變量中設置一個Looper對象。這個調用線程就是LooperThread的run線程。先看看Looper對象的構造,其代碼如下所示: **Looper.java** ~~~ private Looper(){ //構造一個消息隊列 mQueue =new MessageQueue(); mRun =true; //得到當前線程的Thread對象 mThread =Thread.currentThread(); } ~~~ prepare函數很簡單,它主要干了一件事: - 在調用prepare的線程中,設置了一個Looper對象,這個Looper對象就保存在這個調用線程的TLV中。而Looper對象內部封裝了一個消息隊列。 也就是說,prepare函數通過ThreadLocal機制,巧妙地把Looper和調用線程關聯在一起了。要了解這樣做的目的是什么,需要再看第二個重要函數。 2. Looper循環 代碼如下所示: **Looper.java** ~~~ public static final void loop() { Looper me = myLooper();//myLooper返回保存在調用線程TLV中的Looper對象 //取出這個Looper的消息隊列 MessageQueue queue = me.mQueue; while (true) { Message msg = queue.next(); //處理消息,Message對象中有一個target,它是Handler類型 //如果target為空,則表示需要退出消息循環 if (msg != null) { if (msg.target == null) { return; } //調用該消息的Handler,交給它的dispatchMessage函數處理 msg.target.dispatchMessage(msg); msg.recycle(); } } } //myLooper函數返回調用線程的線程局部變量,也就是存儲在其中的Looper對象 public static final Looper myLooper() { return (Looper)sThreadLocal.get(); } ~~~ 通過上面的分析會發現,Looper的作用是: - Looper封裝了一個消息隊列。 - Looper的prepare函數把這個Looper和調用prepare的線程(也就是最終的處理線程)綁定在一起了。 - 處理線程調用loop函數,處理來自該消息隊列的消息。 當事件源向這個Looper發送消息的時候,其實是把消息加到這個Looper的消息隊列里了。那么,該消息就將由和Looper綁定的處理線程來處理。那么,事件源又是怎么向Looper消息隊列添加消息的呢?來看下一節。 3. Looper、Message和Handler的關系 Looper、Message和Handler之間也存在曖昧關系,不過要比RefBase那三個簡單得多,用兩句話就可以說清楚: - Looper中有一個Message隊列,里邊存儲的是一個個待處理的Message。 - Message中有一個Handler,這個Handler是用來處理Message的。 其中,Handler類封裝了很多瑣碎的工作。先來認識一下這個Handler。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看