目录

Start、说在前面

一、初识Handler

1.1 概念

1.2 内容

1.3 小结

1.4 拓展

二、拓展Handler之ANR

2.1 概述ANR

2.2 产生原因

2.3 关系说明

三、拓展Handler之内存泄露

3.1 概述内存泄露

3.2 产生原因

3.3 解决办法

End、写在最后


Start、说在前面

Handler,相信做Android开发的小伙伴对他都不陌生了。

起初,我也是浮于表面的理解和学习(虽然现在也还是没有太深入,但有种比以前好了一些的感觉),慢慢地发现他竟然在Android中到处都可见。

所以今天分享出来我的一些总结,抛砖引玉,帮助更多人,同时也希望有更多动力去深入。

下面我们来说说他吧~

一、初识Handler

1.1 概念

对一个陌生事物了解,首先从概念开始。

简单说,Handler机制是Android中提供的一种异步回调机制,处理子线程和主线程之间的通信。

1.2 内容

涉及到相关重要类及职责是:

1)Handler:负责发送处理消息.

2)MessageQueue:消息队列,负责存储消息.

3)Message:具体发送的消息.

4)Looper:负责循环取出消息给Handler处理.

5)ThreadLocal:用于线程间的数据隔离,每个线程中存放各自对应的looper.

1.3 小结

机制运作总结:子线程中Handler将消息发送到MessageQueue中,然后Looper不断的从MessageQueue中读取消息并调用Handler.dispatchMessage发送消息,最后Handler处理消息。

1.4 拓展

当然内部机制详细内容仍然要详细追寻源码来发现其中的更多奥秘,这里就不展开说了。

通常我们使用Handler可以去刷新界面,可以去制作定时器等等,但没想到他竟然也跟ANR、内存泄露有着关系。那我们一起再看下去吧。

二、拓展Handler之ANR

2.1 概述ANR

ANR异常:Application Not Response 应用程序无响应 。出现这个异常时,会为用户弹出交互式弹窗,影响用户使用和体验。

2.2 产生原因

产生ANR异常的原因:在主线程执行了耗时操作,对Activity来说,主线程阻塞5秒将造成ANR异常,对BroadcastReceiver来说,主线程阻塞10秒将会造成ANR异常。

2.3 关系说明

Handler是线程间通讯的机制,Android中,网络访问、文件处理等耗时操作必须放到子线程中去执行,否则将会造成ANR异常。

解决ANR异常的方法:耗时操作都在子线程中去执行 但是,Android不允许在子线程去修改UI,可我们又有在子线程去修改UI的需求,因此需要借助Handler。

三、拓展Handler之内存泄露

3.1 概述内存泄露

内存泄露:没有用的对象资源仍与GC-Root保持可达路径,导致系统无法回收。

3.2 产生原因

一般造成的原因:

1)非静态内部类默认持有外部类的引用,比如非静态Handler持有Activity引用

2)接收器、监听器的注册没有取消,比如广播、EventBus

3)Activity的Context造成的

4)资源文件没有关闭造成的

等等,还有很多。

3.3 解决办法

我们可以看到Handler的使用不当也会导致内存泄露问题。

知道了之后,我们使用的时候就可以有的放矢、游刃有余的关注和解决了。

public class MyActivity extends Activity{//在Activity中 声明一个静态的Handler内部类 并持有外部类的弱引用private static class InnerHandler extends Handler{private final WeakReference<MyActivity> mActivity;public InnerHandler(MyActivity activity){mActivity = new WeakReference<MyActivity>(activity);}@Overridepublic void handlerMessage(Message msg){MyActivity activity = mActivity.get();if(activity!=null){//...}}}private final InnerHandler mHandler = new InnerHandler(this);private static final runnable = new Runnable(){@Overridepublic void run(){//...}};@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);//延时发送消息mHander.postDelayed(runnable,1000*60*5);}
}

当然其中涉及到了弱引用的使用,可以自行了解相关内容。

End、写在最后

这样串联下来,对Handler是否有了一个更全面的认识呢?

相信让Handler更充盈了一些。当然他不止这些。还需要我们更深入更广度的挖掘。探究内部原理,发现其中奥秘。

--------------------------------------------------------------------------

如有不妥之处,望见谅。提供您的宝贵建议、意见,我会积极改正的。

码字不易,如您喜欢欢迎收藏、点赞等支持,您的支持是我最大的动力!

后续有新文章的发布,欢迎持续关注。谢谢❤

也欢迎关注关注我的掘金博客 摩羯座程序媛 的个人主页 - 动态 - 掘金

我认识Handler又多了一点点...相关推荐

  1. 客户端soap【JAX-WS入门系列】第04章_SOAP异常处理和Handler处理

    这段时间一直在查找客户端soap之类的问题,下午恰好有机会和大家共享一下. 客户端和服务端都是Java Project,首先列出服务端代码 首先是SEI,即服务端接口类HelloService.jav ...

  2. 线程对象Android 开发之多线程处理、Handler 详解

    发一下牢骚和主题无关: 每日一道理 毅力,是千里大堤一沙一石的凝聚,一点点地累积,才有前不见头后不见尾的壮丽:毅力,是春蚕吐丝一缕一缕的环绕,一丝丝地坚持,才有破茧而出重见光明的辉煌: 毅力,是远航的 ...

  3. Android Handler处理机制 ( 三 ) ——Handler,Message,Looper,MessageQueue

    在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handle ...

  4. android之handler的刨根问底

    对于handler,不管处于哪个层次,这个都是必问的面试题,这也是过来人的一个总结.我换工作还是比较频繁的,曾辗转无锡.苏州.南京.上海,虽然我只工作不到四年,呵呵,信息量好像有点大,但其中问到最多的 ...

  5. 偷偷爆料下2022年各公司年终奖情况,也就亿点点羡慕.....

    偷偷爆料下2022年各公司年终奖情况,也就亿点点羡慕- 不少公司已经陆陆续续有年终奖的消息传了出来,这里给大家汇总了截止到1月 30 日,互联网爆料的包括字节.腾讯.百度等公司在内年终奖情况. 在默默 ...

  6. Handler 与 IdleHandler 浅析

    版权声明:本文章原创于 RamboPan ,未经允许,请勿转载. 第一次 2019年03月05日 第一次 2019年03月05日 调整代码块 变量.类名.方法 标记统一 Handler 分析 虽然 H ...

  7. 字节跳动上千道精选面试题还不刷起来!2019-2020大厂高级面试题集合(Handler,性能优化,自定义View等)

    前言 本想今年辞掉工作大干一场,没想到碰到疫情,家里蹲了3个月-,还好字节能给一次机会.前阵子字节跳动的提前批开始了,看宣传是说有海量HC,机会多多,本着涨涨面经的心理,然后就投递了一下杭州那边的部门 ...

  8. 解决Android Handler的handleMessage()方法内TextView.setText偶尔不执行的问题

    前言 最近项目中要加一个体温测量的外设模块 利用android的串口通信 可以完美的取到测量的体温数据 获取到数据后,在用Handler发送数据到View渲染时 发现一个问题 就是数据能测量到 但是渲 ...

  9. 为什么UI线程中创建Handler可以不传Looper?

    一个APP程序的入口是ActivityThread的main方法,ActivityThread就是我们常说的主线程或UI线程,事实上它并不是一个线程,而是主线程操作的管理者. public stati ...

最新文章

  1. MongoDB使用入门
  2. 修改自己的centos输入法
  3. Hibernate一对一主键单向关联
  4. 停车还能360全方位影像_2020款新途锐锐享版上市,智能泊车360全景影像加量不加价...
  5. Visual Studio调试时失去响应的解决办法
  6. linux基础总结1
  7. windows内核——基石
  8. OligoGreen染料|花菁类(Cyanine系列)-引物、Oligo核酸、多肽标记染料
  9. Linux日文教程,【图片】#教程#修正配置 Noto Sans CJK 避免中文显示为异体(日文)字形【linux吧】_百度贴吧...
  10. 小白某东商品评论爬虫+词云 python
  11. 照片文件与计算机系统,如何备份电脑中的照片等重要文件
  12. 【信号重构】经傅里叶逆变换(IFFT)后得到实数序列-含Matlab程序
  13. 电子科技大学格拉斯哥学院基础实践——共享单车的调查
  14. github新手使用指南
  15. AutoSAR系列讲解(入门篇)6.1-Vector的工具链简介
  16. AMD意外泄漏下一代APU信息
  17. Android 建立自己的手写笔画图案 Gesture Builder
  18. 1.41亿老人遭受过虐待,厌老憎老为何成了时代病?
  19. ECHARTS-MAP的使用: 中国地图及省份边界的查看
  20. GPS定位原理及应用简介

热门文章

  1. AI开发第五课 python刷博客流量-2
  2. linux中mp3转wav格式
  3. Linux 快速同步北京时间命令
  4. 刺客列传鸿蒙记经典台词,【原台词整理】第一季天枢cut部分
  5. python快速输入括号_pycharm 实现光标快速移动到括号外或行尾的操作
  6. Spring系列五:Spring怎么解决循环依赖
  7. 使用Vue里面的ref 控制DOM元素的样式marginleft,marginLeft的只是变化了,但是视图没有变化,求解答
  8. 分布式环境下定时任务重复执行问题解决方案
  9. 多媒体 - Nginx直播搭建
  10. esxi做文件服务器拒绝,vpshere6 ESXI 禁止登陆 执行此操作的权限被拒绝