Handler基本使用(一) new Handler
通常我们使用如下方式获取一个Handler对象
private Handler mHandler1 = new Handler(){public void handleMessage(Message msg) {};};private Handler mHandler2 = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {return false;}});
细心一点去看,使用第一种方式定义handler对象时,编译器会报如下警告:
This Handler class should be static or leaks might occur
意思是,Handler类必须为静态的,否则有可能造成内存泄漏。
这是为什么呢,事实上MessageQueen中等待处理的消息持有对Handler对象的引用,而上述第一种方式中我们的Hanler类是一个匿名内部类,它持有了所在外部类的引用(不只是匿名内部类,内部类也会引起这个问题)。一旦消息队列里的消息长时间未处理,那么handler对象就一直被持有,它的外部类也一直被持有,导致无法及时CG,内存泄漏就发生了。
那为什么使用static修饰变量时,就可以避免内存泄漏呢?那是因为静态的方法和变量都不属于类本身,不会持有对类的引用,自然也不会出现内存泄漏了,但是这种方式又必须为静态的代码提供额外的内存,程序中大量使用handler时,这种处理到底合理不合理呢?
经过网友的好心提示,特此更正及讲解第一二种方式的区别
第一种方式new出的handler对象是一个匿名内部类,它直接持有外部类的引用,因此系统直接警告不要使用这种方式
第二种方式new出的handler是一个对象,它本身不是匿名内部类,因此没有警告语句,这里需要提一句,它的回调函数确实也是一个匿名的内部类,但这并不表示handler是匿名内部类。当然第二种方式也是存在内存泄漏的风险的,所以想要直接避免类似的问题,我们可以继承handler 编写自己的实现类,详情可以参考篇末的文章。
为什么这个检查语句只关注handler本身呢,下一篇文章里有讲到哦。
匿名内部类的讲解百科就讲的很好,有疑问的朋友可以点开看看内部类
另外,谢谢各位网友的提示和监督,人无完人,若有不对请多多指教,作者也会接纳意见,但是冷嘲热讽的也不说个所以然的就谢绝了,匿名内部类是什么都没搞清楚的请好好学习一下。
关于警告语句的处理其实还有其他方法 可以参考点击打开链接
Handler基本使用(一) new Handler相关推荐
- java handler使用方法_Android中Handler的使用方法及实例(基础回顾)
Handler使用例1 这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中. 本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s ...
- 【Android 异步操作】Handler 机制 ( Android 提供的 Handler 源码解析 | Handler 构造与消息分发 | MessageQueue 消息队列相关方法 )
文章目录 一.Handler 构造函数 二.Handler 消息分发 三.MessageQueue 消息队列相关函数 一.Handler 构造函数 一般使用 Handler 时 , 调用 Handle ...
- 【Android 异步操作】手写 Handler ( 总结 | Message | MessageQueue | Looper | Handler ) ★
文章目录 一.Message 消息 二.Handler 消息处理者 三.MessageQueue 消息队列 四.Looper 循环者 五.关于 Looper 线程本地变量的说明 一.Message 消 ...
- 【Android 异步操作】手写 Handler ( Handler 发送与处理消息 | Handler 初始化 | 完整 Handler 代码 )
文章目录 一.Handler 发送与处理消息 ( 两大功能 ) 二.Handler 初始化 三.完整 Handler 代码 一.Handler 发送与处理消息 ( 两大功能 ) Handler 有两个 ...
- 【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 )
文章目录 一.主线程中的 Handler 与 Looper 二.Handler 原理简介 一.主线程中的 Handler 与 Looper Android 系统中 , 点击图标启动一个应用进程 , 就 ...
- Android Handler机制(一) 为什么设计Handler
一. 前言 做安卓开发也有好几年了, 一直在用Hanlder, 都是为了做项目功能实现就完了,核心原理研究的不深,平时有什么问题都是看下博客也能够解决,积累的都是零散的,过段时间忘了又得重新去翻, A ...
- Handler之创建子线程Handler
Handler之创建子线程Handler Android的消息机制实现步骤: ①创建当前线程的looper ②创建当前线程的handler ③调用当前线程looper的loop方法 要实现创建子线程H ...
- Handler原理(自己实现Handler)
问题导向 Handler的原理是什么,实现一个Handler,Handler的delay是怎么实现的 实现一个Handler 自己动手撸一个Handler https://blog.csdn.net/ ...
- 再探Handler(上)(Handler核心原理最全解析)
很久之前也写过Handler的相关文章,现在回过头去看,理解的还是较为浅薄.于是乎,决定再来深入研究一遍Handler. 首先抛出一个问题:子线程到主线程的通信方式有哪些?子线程到主线程通信的原理是什 ...
- android handler 传递对象,Android之Handler消息传递机制详解
前言 在Android开发中,多线程应用是非常频繁的,其中Handler机制随处可见. 下面就本人对Handle的一些理解与大家一起分享,共同回顾下Handle异步消息传递机制. 1.Handler是 ...
最新文章
- java 视频分辨率_java – Blackberry:如何在录制前设置视频分辨率
- java中方法的参数传递机制
- 前端学习(2539):节点类型
- linux中快速清空文件内容的方法
- 需求定律的3大挑战——《可以量化的经济学》
- python中的exec()、eval()以及complie()
- python递归函数分叉树枝_python递归函数绘制分形树的方法
- Tomcat 发布时war解压
- 简单的反编译class文件并重新编译的方法
- java gif图片分割合成,js实现GIF图片的分解和合成
- 泰晤士计算机专业排行,泰晤士2021世界大学学科排名:世界大学计算机学科排名...
- 「 程序员的风险控制」意外险:花几十块就能让你不用担心明天和意外哪个先来
- 语音识别之wave文件(*.wav)格式、PCM数据格式介绍
- java泛型类型推断_Java 泛型-类型推断
- ES-分片路由(routing)
- Python-CSV文件存储
- Linux配置SSH服务器
- MarkdownPad2 使用教程
- 下载和攻略补遗之人偶遗迹 ひとがたルイン
- 魅族手机调试出现is waiting for debugger的问题解决