<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                1. 初識Handler Handler中所包括的成員: **Handler.java** ~~~ final MessageQueue mQueue;//Handler中也有一個消息隊列 final Looper mLooper;//也有一個Looper final Callback mCallback;//有一個回調用的類 ~~~ 這幾個成員變量是怎么使用的呢?這首先得分析Handler的構造函數。Handler一共有四個構造函數,它們主要的區別,是在對上面三個重要成員變量的初始化上。我們試對其進行逐一分析。 **Handler.java** ~~~ //構造函數1 public Handler() { //獲得調用線程的Looper mLooper = Looper.myLooper(); if(mLooper == null) { throw new RuntimeException(......); } //得到Looper的消息隊列 mQueue = mLooper.mQueue; //無callback設置 mCallback = null; } //構造函數2 publicHandler(Callback callback) { mLooper = Looper.myLooper(); if(mLooper == null) { throw new RuntimeException(......); } //和構造函數1類似,只不過多了一個設置callback mQueue = mLooper.mQueue; mCallback = callback; } //構造函數3 publicHandler(Looper looper) { mLooper = looper; //looper由外部傳入,是哪個線程的Looper不確定 mQueue = looper.mQueue; mCallback = null; } //構造函數4,和構造函數3類似,只不過多了callback設置 publicHandler(Looper looper, Callback callback) { mLooper= looper; mQueue = looper.mQueue; mCallback = callback; } ~~~ 在上述構造函數中,Handler中的消息隊列變量最終都會指向了Looper的消息隊列,Handler為何要如此做? 2. Handler的真面目 根據前面的分析可知,Handler中的消息隊列實際就是某個Looper的消息隊列,那么,Handler做如此安排的目的何在? 在回答這個問題之前,我先來問一個問題: - 怎么往Looper的消息隊列插入消息? 如果不知道Handler,這里有一個很原始的方法: - 調用Looper的myQueue,它將返回消息隊列對象MessageQueue。 - 構造一個Message,填充它的成員,尤其是target變量。 - 調用MessageQueue的enqueueMessage,將消息插入消息隊列。 這種原始方法的確很麻煩,且極容易出錯。但有了Handler后,我們的工作就變得異常簡單了。Handler更像一個輔助類,幫助我們簡化編程的工作。 2.1 Handler和Message Handle提供了一系列函數,幫助我們完成創建消息和插入消息隊列的工作。這里只列舉其中一二。要掌握詳細的API,則需要查看相關文檔。 ~~~ //查看消息隊列中是否有消息碼是what的消息 final boolean hasMessages(int what) //從Handler中創建一個消息碼是what的消息 final Message obtainMessage(int what) //從消息隊列中移除消息碼是what的消息 final void removeMessages(int what) //發送一個只填充了消息碼的消息 final boolean sendEmptyMessage(int what) //發送一個消息,該消息添加到隊列尾 final boolean sendMessage(Message msg) //發送一個消息,該消息添加到隊列頭,所以優先級很高 final boolean sendMessageAtFrontOfQueue(Message msg) ~~~ 只需對上面這些函數稍作分析,就能明白其他的函數。現以sendMessage為例,其代碼如下所示: **Handler.java** ~~~ public final boolean sendMessage(Message msg) { return sendMessageDelayed(msg, 0); //調用sendMessageDelayed } ~~~ **Handler.java** ~~~ // delayMillis是以當前調用時間為基礎的相對時間 public final boolean sendMessageDelayed(Message msg, long delayMillis) { if (delayMillis < 0) { delayMillis = 0; } //調用sendMessageAtTime,把當前時間算上 return sendMessageAtTime(msg,SystemClock.uptimeMillis() + delayMillis); } ~~~ **Handler.java** ~~~ //uptimeMillis 是絕對時間,即sendMessageAtTime函數處理的是絕對時間 public boolean sendMessageAtTime(Message msg, long uptimeMillis){ boolean sent = false; MessageQueue queue = mQueue; if (queue != null) { //把Message的target設置為自己,然后加入到消息隊列中 msg.target = this; sent = queue.enqueueMessage(msg, uptimeMillis); } return sent; } ~~~ 看到上面這些函數可以想見,如果沒有Handler的輔助,當我們自己操作MessageQueue的enqueueMessage時,得花費多大功夫! Handler把Message的target設為自己,是因為Handler除了封裝消息添加等功能外還封裝了消息處理的接口。 2.2 Handler的消息處理 剛才,我們往Looper的消息隊列中加入了一個消息,按照Looper的處理規則,它在獲取消息后,會調用target的dispatchMessage函數,再把這個消息派發給Handler處理。Handler在這塊是如何處理消息的呢? **Handler.java** ~~~ public void dispatchMessage(Message msg) { //如果Message本身有callback,則直接交給Message的callback處理 if(msg.callback != null) { handleCallback(msg); }else { //如果本Handler設置了mCallback,則交給mCallback處理 if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } //最后才是交給子類處理 handleMessage(msg); } } ~~~ dispatchMessage定義了一套消息處理的優先級,它們分別是: - Message如果自帶了callback處理,則交給callback處理。 - Handler如果設置了全局的mCallback,則交給mCallback處理。 - 如果上述都沒有,該消息則會被交給Handler子類實現的handleMessage來處理。當然,這需要從Handler派生并重載handleMessage函數。 在通常情況下,我們一般都是采用第三種方法,即在子類中通過重載handleMessage來完成處理工作的。 至此,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>

                              哎呀哎呀视频在线观看