Chinaunix首页 | 论坛 | 博客
  • 博客访问: 531043
  • 博文数量: 26
  • 博客积分: 509
  • 博客等级: 下士
  • 技术积分: 809
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-15 18:01
文章分类

全部博文(26)

文章存档

2015年(1)

2013年(6)

2012年(19)

分类: Java

2012-08-20 19:05:47

Android的消息处理有三个核心类,Looper,HandlerMessage。其中还有一个Message Queue消息队列,但是MQ被封装到Looper里面。

 

Looper字面意思是循环者,被设计用来使一个普通线程变成Looper线程。Looper线程就是循环工作的线程,不断从MQ中取出消息,执行消息。

使用Looper类创建Looper线程的方法:

这样一个普通线程就变为了Looper线程

Looper.prepare是将一个Looper对象(内部维护了一个消息队列MQ)放到了当前线程中。调用loop方法之后,Looper线程就会不断从MQ中取出队头的消息执行

Looper的其他方法

·Looper.myLooper()得到当前线程looper对象

·getThread()得到looper对象所属线程

·quit()结束looper循环

 

 

 

Handler

向线程中发送消息可以使用HandlerHandler的默认构造方法将关联当前线程的looper对象,即调用Looper.myLooper()(实现源码中写到),当使用Handler对象发送消息的时候sendMessage,消息会发送到线程中looper对象的MQ中。然后looperMQ中取出消息,分析消息,进行不同的处理操作

由于Handler可以发送两种类型的消息messageRunnable对象,looperMQ中取出消息之后会调用方法,识别消息的类型,分别进行不同的处理。

Android的主线程也是一个looper线程,我们在期中创建的handler默认将关联主线程的MQ。一般在activity中创建handler,将其引用传递给其他线程,在其他线程中用handler对象发送消息到activity中,再在activity中进行执行

Handler的默认构造方法将关联当前线程的Looper

 

在整个消息处理机制中,message又叫task,封装了任务携带的消息和处理该任务的handler。使用时注意:

·尽管Messagepublic的默认构造方法,但是你应该通过Message.obtain()来从消息池中获得空消息对象,以节省资源

·如果message只携带简单的int信息,优先使用Message.arg1Message.arg2来传递信息,这比用Bundle更节省内存

·擅用message.what来标识信息,以便不同方式处理message

 

 

 

来自:http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html

阅读(2657) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~