摘自BAT面试宝典视频
问题引入:点击后更新TextView
重点:
1 、不能在子线程更新UI
2、OOM:HAndler使用不当可能引起内存泄漏
3、Message的优化:要用Handler。obtainMessage()而不是new,会消耗内存。
4、在子线程创建Handler,要准备Looper:Looper.prepare()。
5、空指针异常:Handler消息处理完了单页面销毁了,就会抛出异常。
Handler整体架构 (4个关键类基本关系幕后类Thread)
handler能做什么?
1、处理延时任务:推送将来的Message或Runnable到消息队列;
2、线程间通信:在子线程把需要在另一个线程执行的操作加入到消息队列;
1.png
源码分析(线程如何跨越、生产者消费者设计模式、ThreadLocal原理)
从“handler.sendMessage()”发送消息出发
sendMessage(msg)
---->sendMessageDelay(msg,0)
---->sendMessageAtTime(msg,SysMillis()+delay)
---->enqueueMessage(queue,msg,uptimeMillis);
---->queue.enqueueMessage(msg,uptimeMillis);
enqueueMessage()往MessageQueue发送消息
其他流程图
2.png
所有的send和post都是MessageQueue.enqueueMessage()!
MessageQueue.java
3.png
4.png
用一个for循环不断地.next找消息
是