Win32窗口消息机制 x Android消息机制 x 异步执行
如果你开发过Win32窗口程序,那么当你看到android代码到处都有的mHandler.sendEmptyMessage和
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_REPORT_PRIMARY_CLIP_CHANGED:
reportPrimaryClipChanged();
}
}
};
不禁叹出,这不就是窗口消息机制吗?只是不关窗口的事了,然后分离出来消息机制。
sendMessage这个函数,我们查看窗口属性,改变窗口属性,通知窗口发生事件一切的一切仿佛都在调用这个函数。
WinProc这个消息处理函数,即使你在android的java代码里换了个名handleMessage,我们就认不出你来了吗?
就连Message也同样是一个整形,同时携带两整形参数(windows窗口消息c代码中可以放指针,android消息java代码另外还有Bundle,
Object引用参数,因为int不可以转换对象引用)
这样就很容易理解了:
在windows中,向一个窗口发送窗口消息,实质就是向创建窗口所在的线程的消息队列发送窗口消息,或阻塞等待处理或不阻塞。
在android中,向一个Handler发送消息,同样是在向这个Handler关联的线程的消息队列发送消息,并且不阻塞不等待处理。
在Win32窗口消息机制,消息在消息循环中分派。
在android中,Looper封装了这个消息循环以及消息队列,并在线程的TLS中存放其引用(指针),对于线程唯一存在。如果在实例
Handler时不指明Looper默认借用当前线程的Looper。Handler关联某一个Looper,一个Looper唯一关联一条线程。向Handler发送消息
就是向Looper的消息队列发送(入队)消息,线程必须执行Looper.loop消息循环,消息才能分派。
要注意就是:
窗口在Windows系统是系统范围的,我们可以利用窗口消息进行进程间通讯。而android的Handler却不是。
窗口在Windows系统在创建它的线程上处理消息,任何线程都可以创建窗口。而android的窗口(视图)只能在主线程创建和访问。
在android的消息机制中,还可以发送一个Runnable到某一线程的消息循环中执行,这点就仿如iOS的GCD中的dispatch_async代码块。
参看源代码:
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
Java异步线程执行代码块:
mHandler.post(new Runnable() {
public void run() {
// ....
}
});
OC异步线程执行代码块:
dispatch_async(global_queue, ^{
// ....
});
Win32窗口消息机制 x Android消息机制 x 异步执行的更多相关文章
- Android广播机制:Broadcast
转载:Android总结篇系列:Android广播机制 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广 ...
- Android广播机制
原文出处: Android总结篇系列:Android广播机制 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的 ...
- Android QMI机制
android QMI机制---概论 android QMI机制---QMUX android QMI机制---Qcril初始化流程 android QMI机制---QCRIL消息发送 android ...
- 简析android消息模型
android总结系列 一.消息系统构成要素和基本原理 l 消息队列 l 发送消息 l 消息读取 l 消息分发 l 消息循环线程 消息系统必须要依赖一个消息循环线程来轮询自己的消息队列,如果 ...
- Android - 消息机制与线程通信
以下资料摘录整理自老罗的Android之旅博客,是对老罗的博客关于Android底层原理的一个抽象的知识概括总结(如有错误欢迎指出)(侵删):http://blog.csdn.net/luosheng ...
- Android进阶——Android消息机制之Looper、Handler、MessageQueen
Android消息机制可以说是我们Android工程师面试题中的必考题,弄懂它的原理是我们避不开的任务,所以长痛不如短痛,花点时间干掉他,废话不多说,开车啦 在安卓开发中,常常会遇到获取数据后更新UI ...
- Android消息机制
每一个Android应用在启动的时候都会创建一个线程,这个线程被称为主线程或者UI线程,Android应用的所有操作默认都会运行在这个线程中. 但是当我们想要进行数据请求,图片下载,或者其他耗时操作时 ...
- Android消息机制源码分析
本篇主要介绍Android中的消息机制,即Looper.Handler是如何协同工作的: Looper:主要用来管理当前线程的消息队列,每个线程只能有一个Looper Handler:用来将消息(Me ...
- android 消息机制
一.Android应用程序的主线程主要用于更新UI界面,并且主线程不能做耗时操作,否则会引起ANR:这种情况下需要开一个子线程来进行耗时操作,动作完成之后,子线程发消息给主线程通知其更新UI显示,常见 ...
随机推荐
- 【OUC2019写作】论文写作第九小组英语常用表达整理
第一部分: 一.简要综述以往和现在研究: 某方法被认为如何如何:it is well known that; it is regarded as; it is believed to ; It is ...
- 测试中常用sql
1.增删改查 2.同一服务器下,要从一个数据库复制某张表到另一个数据库 create table test.sf_audit_plan as select * from v3_0_sf_full.sf ...
- java集合第一节,List简单介绍
Java中List集合的常用方法 List接口是继承Collection接口,所以Collection集合中有的方法,List集合也继承过来. package 集合; import java.ut ...
- JAVA必知必问问题-1
数据类型 1) 基本类型: byte, int, long, float, double, boolean.... 要求记住基本类型占多少字节.范围.例如:byte 1字节范围-128-127,sho ...
- 分享一次大厂的技术面试通过,却因学历被拒发 offer 的悲惨经历
概述 今天心情很down,快周末了,说点不开心的事情给大家开心一下,上周面试心仪已久的大厂,技术面很顺利的通过一面/二面/三面,最后到HR面也很顺利,然后被问到学历(自考本科)后,HR 语气发生一些转 ...
- JVM(9) 程序编译及代码优化
一.早期(编译器)优化 1.编译期 Java 语言的 “编译期” 其实是一段 “不确定” 的操作过程,因为它可能是指 一个前端编译器(其实叫 “编译器的前端” 更准确一些)把 *.java 文件转变成 ...
- Dockerfile 指令详解
GitHub Page:https://blog.cloudli.top/posts/Dockerfile-指令详解/ FROM FROM 命令指定基础镜像.在构建镜像时,基础镜像必须指定,因此在 D ...
- 百度NLP预训练模型ERNIE2.0最强实操课程来袭!【附教程】
2019年3月,百度正式发布NLP模型ERNIE,其在中文任务中全面超越BERT一度引发业界广泛关注和探讨.经过短短几个月时间,百度ERNIE再升级,发布持续学习的语义理解框架ERNIE 2.0,及基 ...
- kettle计划任务
在kettle中固定抽取数据,需要用到kichen命令,编好批处理脚本:bat C: cd C:\soft\kettle\data-integration kitchen /file C:\soft\ ...
- Vim 自定义补全利器 Snippet
Vim Snippet 设置 本人是 vim 用户,可以说能不用 IDE 就不用 IDE. Snippet 是一种支持用户自定义补全的需求,在 vim 中,可以使用 UltiSnips 和 Vim-S ...