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字体闪烁动画(线程)
  2. Android中设置关键字高亮的方法
  3. 多线程实现更新android进度条。
  4. 在android获取root权限的方法^_^。
  5. Android CheckBox控件使用OnClickListener和OnCheckedChangeList
  6. Android 线程池管理
  7. Android Studio安装app 报错的问题It is possible that this iss
  8. Google Maps API Key申请方法及地址

随机推荐

  1. android传感器类别
  2. android 软键盘自动弹出和关闭
  3. Android(安卓)EditText达到SearchView的
  4. 高德地图-Android-逆地理转换:经纬度转换
  5. android 圆角背景和通过menu键功能弹出po
  6. android MD5加密(二)
  7. Android(安卓)Socket网络通信
  8. Android中调用设备的照相和摄像功能
  9. Android(安卓)Studio设置类代码模板
  10. android listView的为空时显示