我认识Handler又多了一点点...
目录
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又多了一点点...相关推荐
- 客户端soap【JAX-WS入门系列】第04章_SOAP异常处理和Handler处理
这段时间一直在查找客户端soap之类的问题,下午恰好有机会和大家共享一下. 客户端和服务端都是Java Project,首先列出服务端代码 首先是SEI,即服务端接口类HelloService.jav ...
- 线程对象Android 开发之多线程处理、Handler 详解
发一下牢骚和主题无关: 每日一道理 毅力,是千里大堤一沙一石的凝聚,一点点地累积,才有前不见头后不见尾的壮丽:毅力,是春蚕吐丝一缕一缕的环绕,一丝丝地坚持,才有破茧而出重见光明的辉煌: 毅力,是远航的 ...
- Android Handler处理机制 ( 三 ) ——Handler,Message,Looper,MessageQueue
在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handle ...
- android之handler的刨根问底
对于handler,不管处于哪个层次,这个都是必问的面试题,这也是过来人的一个总结.我换工作还是比较频繁的,曾辗转无锡.苏州.南京.上海,虽然我只工作不到四年,呵呵,信息量好像有点大,但其中问到最多的 ...
- 偷偷爆料下2022年各公司年终奖情况,也就亿点点羡慕.....
偷偷爆料下2022年各公司年终奖情况,也就亿点点羡慕- 不少公司已经陆陆续续有年终奖的消息传了出来,这里给大家汇总了截止到1月 30 日,互联网爆料的包括字节.腾讯.百度等公司在内年终奖情况. 在默默 ...
- Handler 与 IdleHandler 浅析
版权声明:本文章原创于 RamboPan ,未经允许,请勿转载. 第一次 2019年03月05日 第一次 2019年03月05日 调整代码块 变量.类名.方法 标记统一 Handler 分析 虽然 H ...
- 字节跳动上千道精选面试题还不刷起来!2019-2020大厂高级面试题集合(Handler,性能优化,自定义View等)
前言 本想今年辞掉工作大干一场,没想到碰到疫情,家里蹲了3个月-,还好字节能给一次机会.前阵子字节跳动的提前批开始了,看宣传是说有海量HC,机会多多,本着涨涨面经的心理,然后就投递了一下杭州那边的部门 ...
- 解决Android Handler的handleMessage()方法内TextView.setText偶尔不执行的问题
前言 最近项目中要加一个体温测量的外设模块 利用android的串口通信 可以完美的取到测量的体温数据 获取到数据后,在用Handler发送数据到View渲染时 发现一个问题 就是数据能测量到 但是渲 ...
- 为什么UI线程中创建Handler可以不传Looper?
一个APP程序的入口是ActivityThread的main方法,ActivityThread就是我们常说的主线程或UI线程,事实上它并不是一个线程,而是主线程操作的管理者. public stati ...
最新文章
- MongoDB使用入门
- 修改自己的centos输入法
- Hibernate一对一主键单向关联
- 停车还能360全方位影像_2020款新途锐锐享版上市,智能泊车360全景影像加量不加价...
- Visual Studio调试时失去响应的解决办法
- linux基础总结1
- windows内核——基石
- OligoGreen染料|花菁类(Cyanine系列)-引物、Oligo核酸、多肽标记染料
- Linux日文教程,【图片】#教程#修正配置 Noto Sans CJK 避免中文显示为异体(日文)字形【linux吧】_百度贴吧...
- 小白某东商品评论爬虫+词云 python
- 照片文件与计算机系统,如何备份电脑中的照片等重要文件
- 【信号重构】经傅里叶逆变换(IFFT)后得到实数序列-含Matlab程序
- 电子科技大学格拉斯哥学院基础实践——共享单车的调查
- github新手使用指南
- AutoSAR系列讲解(入门篇)6.1-Vector的工具链简介
- AMD意外泄漏下一代APU信息
- Android 建立自己的手写笔画图案 Gesture Builder
- 1.41亿老人遭受过虐待,厌老憎老为何成了时代病?
- ECHARTS-MAP的使用: 中国地图及省份边界的查看
- GPS定位原理及应用简介
热门文章
- AI开发第五课 python刷博客流量-2
- linux中mp3转wav格式
- Linux 快速同步北京时间命令
- 刺客列传鸿蒙记经典台词,【原台词整理】第一季天枢cut部分
- python快速输入括号_pycharm 实现光标快速移动到括号外或行尾的操作
- Spring系列五:Spring怎么解决循环依赖
- 使用Vue里面的ref 控制DOM元素的样式marginleft,marginLeft的只是变化了,但是视图没有变化,求解答
- 分布式环境下定时任务重复执行问题解决方案
- 多媒体 - Nginx直播搭建
- esxi做文件服务器拒绝,vpshere6 ESXI 禁止登陆 执行此操作的权限被拒绝