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看)
阅读(1233) | 评论(0) | 转发(0) |