Android Handler 深入学习(1)

   Android 上的应用类似于 Win32 的消息处理机制,也是由消息驱动来工作的。也是会涉及到消息,消息队列,消息循环,以及处理消息的应用层上的消息处理器。


   下图为 Looper, Handler, Message, MessageQueue 之间的静态关系



   下面会对几个相关组件逐步深入学习了解,先从 消息循环 Looper 开始 了解整个消息的处理流程,并在这个过程中逐步深入了解其他的组件。


   Looper 主要封装了消息循环(loop方法),且维护了相关联的消息队列,结合上图以及Looper的实现源码可以看到 mMainLooper 就是 Looper 的一个静态实例,是存在于应用的主线程中的,当然我们也可以通过 Looper 的 prepare 和 loop 创建一个自己的 Looper,如下实例:


class LooperThread extends Thread {
    public Handler mHandler;
    public void run() {
        Looper.prepare();
        mHandler = new Handler() {
            public void handleMessage(Message msg) {
                // process incoming messages here
            }
        };
        Looper.loop();
    }
}


   在应用中可以如下启动 Looper Thread:


    new LooperThread().start();


   这里其实也就是启动一个执行 LooperThread.run() 的新线程,下面分析一下里面的两个Looper的关键调用prepare和loop,也是从 loop 开始了消息循环。


   1) Looper.prepare


public static void prepare() {
    // 这里就限制了一个线程内只能 prepare 一次
    if (sThreadLocal.get() != null) {
        throw new RuntimeException("Only one Looper may be created per thread");
    }
                                    
    // 构造一个 Looper 对象,并设置到调用线程的线程局部变量中
    sThreadLocal.set(new Looper());
}


   再来看 prepare 中 new 出来的 Looper 实例的构造:


private Looper() {
    mQueue = new MessageQueue();
    mRun = true;
    mThread = Thread.currentThread();
}


  首先它是一个 private,也就限制了外部只能通过 prepare 来创建 Looper,也进一步确保一个线程内只能有一个 Looper 对象。


  另外,看到了此处创建了消息队列,并得到了该 Looper 所属的 thread。

 


你可能感兴趣的:(android,handler,looper,messagequeue)