Chinaunix首页 | 论坛 | 博客
  • 博客访问: 267065
  • 博文数量: 138
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 971
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-03 10:05
文章分类

全部博文(138)

文章存档

2016年(1)

2015年(137)

我的朋友

分类: Android平台

2015-05-19 19:37:23

1 handler存在的意义:利用handler进行消息传递
    多个线程并发操作UI组件可能会导致线程安全问题,为了避免可能出现的线程安全问题,android规定:只允许主线程(UI线程)修改activity里的UI组件。然而,在实际应用中,需要让新启动的线程改变界面组件的属性值,于是就需要消息传递机制将新建线程中的某种改变传递到‘UI线程,让这种改变表现在界面组件的改变上。这种消息传递机制就是handler。
2.handler工作原理
① handler机制中涉及的几个组件:
message:承载信息的消息对象
Looper:一个线程只能拥有一个Looper(单例模式,构造器是私有的,prepare()实现创建Looper对象,构造器中并实现了创建MessageQueue),负责管理MessageQueue。具体的。其loop()方法负责不断地读取MessageQueue中的消息(通过使用一个死循环不断取出MessageQueue队列中的消息来实现),读到消息之后将消息交给发送该消息的handler进行处理。
MessageQueue :先进先出消息队列,管理Message。
Handler:有两个作用--发送消息和处理消息。在新线程中发送消息,在主线程中获取并处理消息。处理消息是如何被触发呢?通过回调的方式--程序员只需要重写消息处理函数,当新线程通过handler对象发送消息时,消息被加入消息队列,looper被启动后不断地从队列中读取消息,交予主线程的发送消息的handler对象,这将触发主线程的消息处理函数被回调,处理消息。
void handleMessage(Message msg);
final  boolean hasMessage (int what[ , Object  object]);
Message obtainMessage();
sendEmptyMessage();
sendMessage(Message msg);
......

② 流程:被Handle发送的消息必须被送到MessageQueue,也就是 当前线程必须有一个MessageQueue,而MessageQueue是由Looper管理,因此,如果希望Handler正常工作,必须在当前线程有一个Looper对象。UI线程中系统已经初始化了一个Looper对象,新建的线程中必须自己创建Looper对象。

当主线程向子线程sendMessage时,要保证子线程建立起来再send。(可以通过log看)
阅读(1180) | 评论(0) | 转发(0) |
1

上一篇:java 类型转换

下一篇:java 数据库

给主人留下些什么吧!~~