码迷,mamicode.com
首页 > 其他好文 > 详细

Looper和Handler类分析

时间:2015-03-14 16:34:25      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

一.  Looper

1. 如何使用Looper?

(1) 定义一个LooperThread.

class LooperThread extends Thread {

    public Handler mHandler;

    public void run() {

        Looper.prepare();    // 调用prepare();

        Looper.loop();         // 进入消息循环。

    }

}

(2) 应用程序中使用LooperThread:

{

   new LooperThread().start();     // 启动新线程,线程函数是run.

}

2. Looper.prepare()函数:

    public static final void prepare() {

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

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

        }

        sThreadLocal.set(new Looper());     // 构造一个Looper对象,设置到调用线程的局部变量(TLV)中,将Looper与线程绑定在一起。

    }

3. Looper的创建:

    private Looper() {

        mQueue = new MessageQueue();    // 构造一个消息队列。

        mRun = true;

        mThread = Thread.currentThread();        // 得到当前线程的Thread对象。

    }

由此可见, 在调用prepare线程中,为该线程设置了一个Looper对象,Looper对象内部封装了一个消息队列。

4. Looper.loop()的实现

    public static final void loop() {

        Looper me = myLooper();       // myLooper()返回保存在调用线程TLV中的Looper对象。

        MessageQueue queue = me.mQueue;

        while (true) {

            Message msg = queue.next();

            if (msg != NULL) {

                if (msg.target == NULL) {     // target类型是Handler类型,若为空,则表示需要退出消息循环。

                       return;

                }

                msg.target.dispatchMessage(msg);   // 调用该消息的handler, 交给它的dispatchMessage函数处理。

                msg.recycle;

            }

        }

    }

5. Looper,Message和Handler的关系:

    Looper中有一个Message队列, 存储待处理的message。

    Message中有一个Handler, 这个Handler用来处理message.

 

二.  Handler

1. Handler类包含了三个成员:

    final MessageQueue mQueue;    // 最终都会指向某个Looper的消息队列

    final Looper mLooper;           // 它的值有可能通过构造函数由外面传进来,有可能通过Looper.myLooper()函数获得调用线程的Looper。

    final Callback mCallback;   // 作为回调用。

2. Handler提供了一系列用于创建消息和插入消息队列的函数。如发送消息的函数:

    public final boolean sendMessage(Message msg) {

        return sendMeeageDelayed(msg, 0);

    }

    public final boolean sendMessageDelayed(Message msg, long delayMillis) {         // delayMillis是以当前时间为基础的相对时间

        if (delayMillis < 0) {

              delayMillis = 0;

        }

        return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);      // 调用sendMessageAtTime, 把当前时间算上。

    }

    public final boolean sendMessageAtTime(Message msg, long uptimeMillis)  {             // uptimeMillis是绝对时间,因此该函数处理的是绝对时间

        bool sent = false;

        if (mQueue != null) {

              msg.target = this;                                                       // 将target设为自己,因为Handler还封装了消息处理的接口。

              sent = mQueue.enqueueMessage(msg, uptimeMillis);

        }

        return sent;

    }

3. 处理消息的函数dispatchMessage()

    public void dispatchMessage(Message msg) {

        if (msg.callback != null) {      // 如果Message本身有callback, 则直接交给Message的callback处理。

             handleCallback(msg);

        } else {

             if (mCallback != null) {        // 若本Handler设置了mCallback, 则交由它处理。

                 if (mCallback.handleMessage(msg)) {

                      return;

                 }

             }

              handleMessage(msg);      // 最后交给子类处理。

        }

    }

Looper和Handler类分析

标签:

原文地址:http://www.cnblogs.com/Jackwen/p/4337571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!