《Android系统学习》第十章:Android消息处理、消息循环和消息队列
来源:互联网 发布:配音培训机构知乎 编辑:程序博客网 时间:2024/05/22 13:45
====================================================================================================================================
一、JAVA层Handler、MessageQueue和Looper
1.三个类关系
MessageQueue类是在Looper类中被实例化的,并被记录下来:
frameworks/base/core/java/android/os/Looper.java
private Looper(boolean quitAllowed) { mQueue = new MessageQueue(quitAllowed); mRun = true; mThread = Thread.currentThread();}
Looper类又是以参数的形式传递给Handler类的:
frameworks/base/core/java/android/os/Handler.java
public Handler(Looper looper, Callback callback) { mLooper = looper; mQueue = looper.mQueue; mCallback = callback;}
2.处理流程
首先会调用Handler的sendMessage:
frameworks/base/core/java/android/os/Handler.java
public final boolean sendMessage(Message msg){ return sendMessageDelayed(msg, 0);}public final boolean sendMessageDelayed(Message msg, long delayMillis){ if (delayMillis < 0) { delayMillis = 0; } return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);}public boolean sendMessageAtTime(Message msg, long uptimeMillis){ boolean sent = false; MessageQueue queue = mQueue; if (queue != null) { msg.target = this; sent = queue.enqueueMessage(msg, uptimeMillis); } else { RuntimeException e = new RuntimeException( this + " sendMessageAtTime() called with no mQueue"); Log.w("Looper", e.getMessage(), e); } return sent;}
接着我们看Looper类的死循环:
frameworks/base/core/java/android/os/Looper.java
public static void loop() { final Looper me = myLooper(); ...... final MessageQueue queue = me.mQueue; ...... for (;;) { Message msg = queue.next(); // might block if (msg == null) { return; } Printer logging = me.mLogging; if (logging != null) { logging.println(">>>>> Dispatching to " + msg.target + " " + msg.callback + ": " + msg.what); } msg.target.dispatchMessage(msg); ...... }}
msg.target.dispatchMessage(msg)其实就是下面:
frameworks/base/core/java/android/os/Handler.java
public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); }}说明:一般继承Handler类都会重新实现handleMessage函数,完成消息处理。
二、C++层Looper应用
C++层Looper是在实例化时创建睡眠/唤醒管道、传入回调函数;当通过唤醒管道唤醒进程时,首先执行回调函数处理的。与JAVA层机制不一样!
- 《Android系统学习》第十章:Android消息处理、消息循环和消息队列
- Android消息队列处理消息
- Android消息处理机制(二):循环和消息队列的创建
- Android消息处理系统
- 消息和消息处理之消息循环
- vc/mfc 进程消息队列,线程消息队列,和系统消息队列,该如何处理
- Android消息处理学习笔记
- Android消息队列(二)--异步消息处理
- Android消息队列(三)--多线程与消息处理
- android应用消息处理机制分析之消息循环
- Android消息队列模型
- Android消息队列
- android开发 - 消息队列
- Android消息队列模型
- Android消息队列原理
- Android 消息队列模型
- android 消息队列 ConcurrentLinkedQueue
- Android消息队列
- 多域名ThinkPHP利用MEMCACHE方式共享SESSION数据
- 根据已知字符串遍历整个数据库查找它所在的表和列位置以及出现的次数
- mongoDB简单使用
- android 软键盘的弹出问题总结
- HDU 1056 HangOver
- 《Android系统学习》第十章:Android消息处理、消息循环和消息队列
- Shell编程与vim控制命令
- HDU 1106 排序
- vi实用命令
- makefile
- 详解yii用户登录体系
- ThinkPHP使用总结
- 实现Path2.0中绚丽的的旋转菜单
- AVL树java实现代码