正式开始介绍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:
public Handler()
public Handler(Callback callback)
创建与指定线程相关联的Handler:
public Handler(Looper looper)
public Handler(Looper looper, Callback callback)
B、创建消息
- public final Message obtainMessage()
- public final Message obtainMessage(int what)
- public final Message obtainMessage(int what, Object obj)
- public final Message obtainMessage(int what, int arg1, int arg2)
- public final Message obtainMessage(int what, int arg1, int arg2, Object obj)
C、删除消息
删除在消息队列中未处理的消息
- public final void removeMessages(int what)
- public final void removeMessages(int what, Object object)
D、发送消息
- public final boolean sendMessage(Message msg)
- public final boolean sendMessageDelayed(Message msg, long delayMillis)
- public final boolean post(Runnable r)
- 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函数处理消息)。
- public void dispatchMessage(Message msg) {
- if (msg.callback != null) {
- handleCallback(msg);
- } else {
- if (mCallback != null) {
- if (mCallback.handleMessage(msg)) {
- return;
- }
- }
- handleMessage(msg);
- }
- }
二、Message机制的用途
Message机制有两种用途:
定时执行:延迟到指定时间执行消息调度
线程通讯:将某些操作在其他线程中排队执行
1、定时执行
通过本线程的Handler将消息延迟到指定时间执行,相当于定时器的作用
- public final boolean sendMessageDelayed(Message msg, long delayMillis)
- 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做成相应的更新。
总结:所谓的消息机制其实很简单,实现这种机制需要只需要四步:
1、实例化Looper(因为实例化Handler时需要一个looper);
2、实例化Handler,这里需要覆盖handleMessage方法,处理收到的消息;
3、 实例化Message对象,调用已经实例化好的handler对象的obtainMessage方法,把数据传给obtainMessage方 法,obtainMessage方法就会实例化一个Message对象。(这里也可以发送实现Runnable接口的对象);
4、调用Handler的sendMessage方法把实例化好的Message对象发送出去。对每个线程过程都是一样的,只要按照上面的四个步骤来就可以发送和接收消息了。
通过全文的阅读相信你已经对Message机制应用有了一定的理解,希望今后多多实践练习,一定会熟练掌握。
本文标题:Android中Message机制的灵活应用
新闻来源:http://www.mswzjz.com/qtweb/news26/209526.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联