自己的理解:
Handler的基础使用是 Handler handler=new Handler{ handlerMessage(){}} handler.sendMessage
这当中涉及四个类 Handler Looper(主功能是开启循环机制) Messagequeue(单链表) Message (消息对象 包含handler对象)
handler发送消息最终会调用sendMessageAtTime handler持有MesageQueue 调用enqueueMessage 把消息加入进去 然后Looper 又会从MessageQueue中获取Message 因为Message持有handler 所以可以执行handler回调。
总结
1、一个线程只有一个Looper 一个looper只有一个MessageQueue。
2、一个线程如何保证只有一个Looper的?因为Looper里面有LocalThread LocalThread有类似Hashmap的数据结构 key值是线程 value是Looper 通过这种数据结构保证了一个线程对应一个Looper。
3、Handler为什么会出现内存泄漏 因为创建Handler是匿名内部类持有外部的引用 就是当前的Activity对象。sengDeday 就是发送延时消息的时候如果Activity退出了 但是Handler 还是持有当前对象的,导致Gc无法回收对象就出现内存泄漏。
4、Looper里面的死循环为什么没有导致ANR?这是2种不同的概念,ANR出现是因为事件未处理或者未在规定的事件内处理完成,比如点击事件、广播事件造成的卡顿。Looper里面的死循环 是对Message的存取然后处理,及时没有消息处理 会调用Native方法让线程处于休眠等待状态。
网友评论