Android Message 及其使用
一、线程间通讯的Message机制
1、Message介绍
frameworks\base\core\java\android\Os\Message.java
Message是线程之间传递信息的载体,包含了对消息的描述和任意的数据对象。Message中包含了两个额外的 int字段和一个object字段,这样在大部分情况下,使用者就不需要再做内存分配工作了。虽然Message的构造函数是public的,但是最好是使用Message.obtain( )或Handler.obtainMessage( )函数来获取Message对象,因为Message的实现中包含了回收再利用的机制,可以提供效率。
2、MessageQueue介绍
frameworks\base\core\java\android\Os\MessageQueue.java
MessageQueue用来容纳Message队列的,其中的Message是由Looper来分发的,Message不能直接添加到MessageQueue中,而是要通过与Looper关联的Handler去添加。
3、Looper
frameworks\base\core\java\android\Os\Looper.java
Looper是线程用来运行消息循环的。线程本身是没有消息循环的,需要在线程中调用perpare函数,然后调用loop去处理消息。在Android中,系统在启动主线程的时候会自动为之建立一个Looper。
建立本线程的Looper:
public static final void prepare()
运行本线程的Looper:
public static final void loop()
获取本线程的Looper:
public static final Looper myLooper()
获取主线程的Looper:
public synchronized static final Looper getMainLooper()
4、Handler
frameworks\base\core\java\android\Os\Handler.java
Handler是用来发送和处理与线程相关联的Message和Runnable对象的。每个Handler都与一个单独的线程以及线程消息队列相关联的。当你创建Handler时,Handler就与线程以及线程消息队列绑定了,从那以后,Handler就可以将 Message和Runnable发送给对应的消息队列,并且能够处理从消息队列中出来的消息。
Handler提供了用户需要调用的大部分接口
A、创建Handler:
创建与本地线程相关联的Handler:
1
|
public Handler()
|
2
|
3
|
public Handler(Callback callback)
|
创建与指定线程相关联的Handler:
1
|
public Handler(Looper looper)
|
2
|
3
|
public Handler(Looper looper, Callback callback)
|
B、创建消息
1
|
public final Message obtainMessage()
|
2
|
3
|
public final Message obtainMessage( int what)
|
4
|
5
|
public final Message obtainMessage( int what, Object obj)
|
6
|
7
|
public final Message obtainMessage( int what, int arg1, int arg2)
|
8
|
9
|
public final Message obtainMessage( int what, int arg1, int arg2, Object obj)
|
C、删除消息
删除在消息队列中未处理的消息
1
|
public final void removeMessages( int what)
|
2
|
3
|
public final void removeMessages( int what, Object object)
|
D、发送消息
1
|
public final boolean sendMessage(Message msg)
|
2
|
3
|
public final boolean sendMessageDelayed(Message msg, long delayMillis)
|
4
|
5
|
public final boolean post(Runnable r)
|
6
|
7
|
public final boolean postDelayed(Runnable r, long delayMillis)
|
E、处理消息
在Looper的loop函数中循环取出MessageQueue的接收消息队列中的消息,然后调用Hander的dispatchMessage函数对消息进行处理,至于如何处理(相应消息)则由用户指定(三个方法,优先级从高到低:Message里面的Callback,一个实现了Runnable接口的对象,其中run函数做处理工作;Handler里面的mCallback指向的一个实现了Callback接口的对象,里面的handleMessage进行处理;处理消息 Handler对象对应的类继承并实现了其中handleMessage函数,通过这个实现的handleMessage函数处理消息)。
01
|
public void dispatchMessage(Message msg) {
|
02
|
03
|
if (msg.callback != null ) {
|
04
|
05
|
handleCallback(msg);
|
06
|
07
|
} else {
|
08
|
if (mCallback != null ) {
|
09
|
if (mCallback.handleMessage(msg)) {
|
10
|
return ;
|
11
|
}
|
12
|
}
|
13
|
14
|
handleMessage(msg);
|
15
|
}
|
16
|
}
|
二、Message机制的用途
Message机制有两种用途:
定时执行:延迟到指定时间执行消息调度
线程通讯:将某些操作在其他线程中排队执行
1、定时执行
通过本线程的Handler将消息延迟到指定时间执行,相当于定时器的作用
1
|
public final boolean sendMessageDelayed(Message msg, long delayMillis)
|
2
|
3
|
public final boolean postDelayed(Runnable r, long delayMillis)
|
还可以在指定时间到期之前,通过removeMessages取消执行
2、线程通讯
Android的UI是单线程的,Android希望UI线程能够给予User快速的反应,如果UI线程花费太多的时间做幕后的事情,吵过5秒钟,Android就会给出错误提示。因此为了避免拖住UI,一下较费时的工作应该交给独立的线程去执行。但是如果幕后的线程来执行UI对象,Android又会发出错误信息,所以UI线程与幕后线程需要进行通讯。UI线程将工作分发给幕后线程,幕后线程执行后将相应的状态返回给UI线程,让UI线程对UI做成相应的更新。
转载于:https://www.cnblogs.com/huanjianlin/p/3210306.html
Android Message 及其使用相关推荐
- Android Message和obtainMessage的区别
Android Message和obtainMessage的区别 类概述 定义一个包含任意类型的描述数据对象,此对象可以发送给Handler.对象包含两个额外的int字段和一个额外的对象字段,这样可以 ...
- Android Message解析
在android的消息机制中,Message其充当着信息载体的一个角色,通俗的来说,我们看作消息机制就是个工厂的流水线,message就是流水线上的产品,messageQueue就是流水线的传送带.之 ...
- android message 代码,Android Handler移除Message详解及实例代码
Android Handler移除Message详解 问题: 1.removeMessage(what)函数是否只能移除对应what值的Message? 2.对于Delayed发送的Message,能 ...
- Android Message Learning from MTK
Google Native Source Code 谷歌原生代码 设置中的SIM卡管理:SimManagementSettings siminfo.mDisplayName Q: 卡槽1插移动 ...
- android message的作用,Android消息机制之Message解析(面试)
在android的消息机制中,Message其充当着信息载体的一个角色,通俗的来说,我们看作消息机制就是个工厂的流水线,message就是流水线上的产品,messageQueue就是流水线的传送带.之 ...
- python手机版安卓-当python遇到Android手机 那么,万物皆可盘
嚣张开场 今天不跟大家讲python知识,是不很失望?No,看过了今天的内容,你python的装13指数,至少上升1w+,并附带暴击.溅射.眩晕.致盲效果.没错,就是这么嚣张..... 当python ...
- android @id和@+id的区别
今天,简单讲讲android里关于@id和@+id的区别. 之前,自己在布局里无论什么情况都使用@+id,可是后来发现有些代码用的是@id,自己不知道这两者之间有什么区别.于是就在网上查找资料,最终是 ...
- Flutter如何与Native(Android)进行交互
目录 前言 BasicMessageChannel Android端- (1)不使用engine cache预热 (2)使用engine cache预热 Flutter端- MethodChannel ...
- 读博文学Android
学习Android的过程中得到来自互联网上乐于分享和奉献的人们的帮助,这里收集了一些Android相关的知识点的介绍,研究,实践的博文地址.每篇文章将带给学习者更多的帮助,有些地址需要FQ的帮助. 基 ...
最新文章
- 2019-1-17王志颖 c语言作业
- 计算机图形学基础考试题,计算机图形学基础复习题
- 中国电信线CTF线下选拨writeup
- 【Oracle 学习笔记】Day 1 常用函数整理(转换、DeCode),表的外键
- table 内 下拉列表 被遮挡_一个简洁、有趣的无限下拉方案
- Java面试题-框架篇九
- 项目 11 部署与运行
- nginx 访问控制之 document_uri
- 项目管理(七)- 项目利益相关者责任
- 黑马程序员——Java基础知识——泛型、枚举
- 我在CSDN参与的3000个帖子
- 安装python与编译工具vs code(中文版)和pycharm(中文版)
- Java数据库篇之mysql VS postgresql
- VUE实现DIV点击换色
- NCT青少年编程能力等级测试Python编程三级-模拟卷1(含答案)
- 论文中英对照翻译--(Fusing Multiple Deep Features for Face Anti-spoofing)
- Python基础入门9:字符串1,字符串的驻留
- USB device USB controller USB passthrough
- 下载加密的流媒体视频
- [51nod1074]约瑟夫环V2
热门文章
- mysql 路由_mysql 命令大全
- python软件安装步骤-一篇非常棒的安装Python及爬虫入门博文!
- python用中文怎么说-如何用Python做中文分词?
- python32-python32和
- 0基础学python-0基础学python 全套教程送你参考
- python绘制3d图-使用python绘制3d的图形
- 开课吧python课程-明星为开课吧直播带货:人人都要学,人人都可以学的Python
- python学精通要多久-学习Python零基础需要学多久?
- php和python和java-python和java,php,c,c#,c++的对比
- 从小白到精通python要多久-小白学Python需要多久?老男孩Python培训教程