Handler机制
一,Handler概述:
Handler是Android提供的一套线程通讯机制。因为子线程直接操作UI线程不安全,当其他线程需要操作UI线程时,将这些操作信息封装成Message,传递到UI线程,再由Handler处理。
Handler用于在同一进程不同线程间通信
Message:代表一个行为或一串动作(Runnable线程),每个消息在被传入队列时都有一个明确的目标Handler
Handler:消息的发送者和处理者
MessageQueue:循环队列,负责存储消息
Looper: 负责将消息从队列中去除并交给对应的Handler处理,每个线程只有一个Looper,UI线程自动创建,其他线程需要手动创建并开启,内部是一个无线循环从Queue里面取消息,如果Queue为空则return退出循环(一般不会由此退出)
Looper.prepare() //创建
Looper.loop() //开启循环
二,Handler原理:
而且双方线程都是可以直接访问共享区域,不需要将数据拷贝一份发送,只需要使用Linux管道机制进行通讯,通知一下对面有数据,你去拿然后处理就行了
二,注意事项:
1,由于Message持有Handler,而Handler又持有Activity,所以当消息还没处理完就关闭Activity时,会导致Activity因还有强引用而清理不掉,导致内存泄露
解决方法是将Activity中的Handler定义为静态,然后在该Handler中持有Activity的弱引用。
2,Message的复用,频繁创建和清理Message会造成内存抖动,因此Message被设计成可复用的,方法是使用以下两个方法获取消息:
Message.obtain()
Handler对象.obtainMessage()
3,发送接受消息的一般是同一个Handler,发送时会把Message的target属性赋值为发送此消息的Handler对象,分发消息时由此找到对应的Handler处理