java中手写handler_Handler源码讲解+手写机制

本文深入探讨Java中Handler的使用,强调不能在子线程更新UI,以及Handler可能导致的OOM和内存泄漏问题。文章通过源码分析讲解了Handler、Looper、MessageQueue之间的关系,阐述了Handler发送和处理消息的流程,以及如何避免空指针异常。此外,还介绍了Message的优化方法,如使用obtainMessage(),以及如何在子线程创建Handler。最后,文章讨论了ThreadLocal在确保Looper唯一性中的作用,并提出尽管通常认为子线程不能更新UI,但在特定情况下可以绕过这一限制。
摘要由CSDN通过智能技术生成

摘自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、线程间通信:在子线程把需要在另一个线程执行的操作加入到消息队列;

4d8b3eeecfe8

1.png

源码分析(线程如何跨越、生产者消费者设计模式、ThreadLocal原理)

从“handler.sendMessage()”发送消息出发

sendMessage(msg)

---->sendMessageDelay(msg,0)

---->sendMessageAtTime(msg,SysMillis()+delay)

---->enqueueMessage(queue,msg,uptimeMillis);

---->queue.enqueueMessage(msg,uptimeMillis);

enqueueMessage()往MessageQueue发送消息

其他流程图

4d8b3eeecfe8

2.png

所有的send和post都是MessageQueue.enqueueMessage()!

MessageQueue.java

4d8b3eeecfe8

3.png

4d8b3eeecfe8

4.png

用一个for循环不断地.next找消息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值