通常我们使用如下方式获取一个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相关推荐

  1. java handler使用方法_Android中Handler的使用方法及实例(基础回顾)

    Handler使用例1 这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中. 本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s ...

  2. 【Android 异步操作】Handler 机制 ( Android 提供的 Handler 源码解析 | Handler 构造与消息分发 | MessageQueue 消息队列相关方法 )

    文章目录 一.Handler 构造函数 二.Handler 消息分发 三.MessageQueue 消息队列相关函数 一.Handler 构造函数 一般使用 Handler 时 , 调用 Handle ...

  3. 【Android 异步操作】手写 Handler ( 总结 | Message | MessageQueue | Looper | Handler ) ★

    文章目录 一.Message 消息 二.Handler 消息处理者 三.MessageQueue 消息队列 四.Looper 循环者 五.关于 Looper 线程本地变量的说明 一.Message 消 ...

  4. 【Android 异步操作】手写 Handler ( Handler 发送与处理消息 | Handler 初始化 | 完整 Handler 代码 )

    文章目录 一.Handler 发送与处理消息 ( 两大功能 ) 二.Handler 初始化 三.完整 Handler 代码 一.Handler 发送与处理消息 ( 两大功能 ) Handler 有两个 ...

  5. 【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 )

    文章目录 一.主线程中的 Handler 与 Looper 二.Handler 原理简介 一.主线程中的 Handler 与 Looper Android 系统中 , 点击图标启动一个应用进程 , 就 ...

  6. Android Handler机制(一) 为什么设计Handler

    一. 前言 做安卓开发也有好几年了, 一直在用Hanlder, 都是为了做项目功能实现就完了,核心原理研究的不深,平时有什么问题都是看下博客也能够解决,积累的都是零散的,过段时间忘了又得重新去翻, A ...

  7. Handler之创建子线程Handler

    Handler之创建子线程Handler Android的消息机制实现步骤: ①创建当前线程的looper ②创建当前线程的handler ③调用当前线程looper的loop方法 要实现创建子线程H ...

  8. Handler原理(自己实现Handler)

    问题导向 Handler的原理是什么,实现一个Handler,Handler的delay是怎么实现的 实现一个Handler 自己动手撸一个Handler https://blog.csdn.net/ ...

  9. 再探Handler(上)(Handler核心原理最全解析)

    很久之前也写过Handler的相关文章,现在回过头去看,理解的还是较为浅薄.于是乎,决定再来深入研究一遍Handler. 首先抛出一个问题:子线程到主线程的通信方式有哪些?子线程到主线程通信的原理是什 ...

  10. android handler 传递对象,Android之Handler消息传递机制详解

    前言 在Android开发中,多线程应用是非常频繁的,其中Handler机制随处可见. 下面就本人对Handle的一些理解与大家一起分享,共同回顾下Handle异步消息传递机制. 1.Handler是 ...

最新文章

  1. java 视频分辨率_java – Blackberry:如何在录制前设置视频分辨率
  2. java中方法的参数传递机制
  3. 前端学习(2539):节点类型
  4. linux中快速清空文件内容的方法
  5. 需求定律的3大挑战——《可以量化的经济学》
  6. python中的exec()、eval()以及complie()
  7. python递归函数分叉树枝_python递归函数绘制分形树的方法
  8. Tomcat 发布时war解压
  9. 简单的反编译class文件并重新编译的方法
  10. java gif图片分割合成,js实现GIF图片的分解和合成
  11. 泰晤士计算机专业排行,泰晤士2021世界大学学科排名:世界大学计算机学科排名...
  12. 「 程序员的风险控制」意外险:花几十块就能让你不用担心明天和意外哪个先来
  13. 语音识别之wave文件(*.wav)格式、PCM数据格式介绍
  14. java泛型类型推断_Java 泛型-类型推断
  15. ES-分片路由(routing)
  16. Python-CSV文件存储
  17. Linux配置SSH服务器
  18. MarkdownPad2 使用教程
  19. 下载和攻略补遗之人偶遗迹 ひとがたルイン
  20. 魅族手机调试出现is waiting for debugger的问题解决

热门文章

  1. 大端和小端的区别和判断
  2. 【学习资料】中国开放大学-电大-《教育学》形考作业答案(2018).docx
  3. jquery获取所有选中的复选框
  4. 索引超出数组元素的数目(1)
  5. PHP --方法调用
  6. 功能性和非功能性需求 UP中FURPS+模型需求分类方式
  7. 在网络安全领域,比较牛的中国黑客有哪些?
  8. winpe修复计算机无法启动,PE修复系统启动故障的详细教程
  9. UVA 207 PGA Tour Prize Money
  10. 方便、免费的PDF在线处理网站汇总:PDF合并、文字编辑、页面提取与删除、格式转换…