Android消息处理机制系列文章整体内容如下

Android消息处理机制1——Handler
Android消息处理机制2——Message
Android消息处理机制3——MessageQueue
Android消息处理机制4——Looper

一 使用

Class used to run a message loop for a thread. Threads by default do not have a message loop associated with them; to create one, call prepare in the thread that is to run the loop, and then loop to have it process messages until the loop is stopped.

翻译成中文是

Looper用于运行线程的消息循环,线程默认没有关联looper;如果要创建一个looper,先在线程内部调用prepare(),然后循环让它处理消息,直到线程停止。

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();        }    }

Android也提供了一个关联looper的线程 HandlerThread

二 构造器

    private Looper(boolean quitAllowed) {        mQueue = new MessageQueue(quitAllowed);        mThread = Thread.currentThread();    }

创建Looper实例的时候会同时创建一个MessageQueue,Looper只有一个私有的构造器,创建一个Looper实例只能通过

public static void prepare() {        prepare(true);    }

其内部又调用私有方法

    private static void prepare(boolean quitAllowed) {        if (sThreadLocal.get() != null) {            throw new RuntimeException("Only one Looper may be created per thread");        }        sThreadLocal.set(new Looper(quitAllowed));    }

Looper是用ThreadLocal存储的,ThreadLocal存储的变量有一个特点,就是只能被同一个线程读写。
上面的代码的意思是,如果该线程已经绑定一个Looper实例,则抛出异常,否则就创建一个。

 public static void prepareMainLooper()

主线程初始化的时候会调用prepareMainLooper来创建Looper实例

三 管理消息队列

使用loop()方法来管理消息队列,通过loop()方法循环从MessageQueue里面取出消息,然后给handler处理。loop()方法里调用for(;;)形成死循环,当前线程在loop方法之后的方法都不会执行。下面分析loop方法的源码

public static void loop() {        final Looper me = myLooper();       //代码省略        for (;;) {            Message msg = queue.next(); //  取出messageQueue头部的message,同时会把该message从messageQueue删除            if (msg == null) {                // No message indicates that the message queue is quitting.                return;            }            //代码省略            try {                msg.target.dispatchMessage(msg); //msg.target获取处理message的handler,其实就是发送该message的handler,然后调用该handler的dispatchMessage方法,将消息分发给该handler让其进行处理。            } finally {                if (traceTag != 0) {                    Trace.traceEnd(traceTag);                }            }            //代码省略            msg.recycleUnchecked(); //将该msg初始化,并放入message池里面        }    }

loop()方法里做了三件事:

  1. 从messageQueue里面取出消息
  2. 将message分发给相应的handler,让handler处理
  3. 回收该message,将它放到消息池里面,消息池的数据结构是一个先进后出的链式栈

(完)

参考的文章:
Java ThreadLocal

更多相关文章

  1. Android(安卓)Handler解析和相关问题
  2. android字体闪烁动画(线程)
  3. Android之SurfaceView学习
  4. 多线程实现更新android进度条。
  5. Android(安卓)分享微信小程序
  6. android各种触摸事件的处理,touchEvent
  7. Android(安卓)线程池管理
  8. Android中Message机制的灵活应用
  9. Android(安卓)Interface Definition Language (AIDL) android接

随机推荐

  1. mysql 5.7.17 安装配置方法图文教程(Cent
  2. SQL Server COALESCE函数详解及实例
  3. windows 10 下安装mysql 5.7.17的简单笔
  4. 详解windows下mysql的主从同步
  5. Mybatis报错: org.apache.ibatis.excepti
  6. SQL Server 数据库的备份详细介绍及注意
  7. 详解MySQL的主从复制、读写分离、备份恢
  8. windows mysql 自动备份的几种方法汇总
  9. 深度解析MySQL 5.7之临时表空间
  10. MySQL 使用 SSL 连接配置详解