Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android編程入門 >> android高級---->Handler的原理

android高級---->Handler的原理

編輯:Android編程入門

  andriod提供了Handler來滿足線程間的通信,上次在更新UI的時候也提到過Handler的使用,關於Handler的基本使用,參見博客(android基礎---->子線程更新UI).今天我們深入Handler的源碼,了解一個Handler的內部執行原理。

 

目錄導航

  1.   Handler簡單說明
  2.   ActivityThread的說明
  3.   Handler的預備分析
  4.   Handler的原理分析
  5.   友情鏈接

 

android基礎---->子線程更新UI)。以下的分析我會帖出有關例子的重要代碼:

一、 創建一個Handler,處理消息:

public static final int UPDATE_TEXT = 1;
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case UPDATE_TEXT:
                textView.setText("I Love you.");
                break;
            default:
                break;
        }
    }
}

 

二、 發送消息:

// 用handler處理上述問題
public void handlerUpdate(View view) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            Message message = new Message();
            message.what = UPDATE_TEXT;
            handler.sendMessage(message); // 將Message對象發送出去
        }
    }).start();
}

 

三、 首先我們要創建一個handler,具體構造方法代碼如下,這裡由於是new Handler():callback=null,async=false

public Handler(Callback callback, boolean async) {
    if (FIND_POTENTIAL_LEAKS) {
        final Class<? extends Handler> klass = getClass();
        if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
                (klass.getModifiers() & Modifier.STATIC) == 0) {
            Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
                klass.getCanonicalName());
        }
    }

    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 = callback;
    mAsynchronous = async;
}

 

四、 接下來進行了我們消息的發送:handler.sendMessage(message),源代碼如下:(中間我們省略了一些過程)

public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
    MessageQueue queue = mQueue;
    if (queue == null) {
        RuntimeException e = new RuntimeException(
                this + " sendMessageAtTime() called with no mQueue");
        Log.w("Looper", e.getMessage(), e);
        return false;
    }
    return enqueueMessage(queue, msg, uptimeMillis);
}
  enqueueMessage(queue, msg, uptimeMillis)的代碼如下:
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
    msg.target = this;
    if (mAsynchronous) {
        msg.setAsynchronous(true);
    }
    return queue.enqueueMessage(msg, uptimeMillis);
}
  • 所謂發送消息就是把消息放入消息隊列中的合適位置,並且把消息的target設置為本Handler對象。

 

五、 在上述Handler的預備分析當中,我們提到過Looper的loop方法,它負責從隊列中取出消息,並且分發消息。而且我們在Handler的dispatchMessage方法也了解到,分發的消息會由Handler的handleMessage方法處理:也就是我們創建的Handler的重寫方法:

public void handleMessage(Message msg) {
    switch (msg.what) {
        case UPDATE_TEXT:
            textView.setText("I Love you.");
            break;
        default:
            break;
    }
}
  • 當隊列中的消息處理的時候,也會找到當時送它來的Handler對象,
  • 調用其相應的dispatchMessage()方法
  • 調用其中的handleMessage()方法或者mCallback成員的handleMessage()方法來進行處理。

 

友情鏈接

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved