问题描述:

    Handler 内部类持有 外部类Activity的引用,如果Activity退出而Handler还有延迟处理的消息没有处理完,会导致Activity不能回收,反复如此会导致内存泄露。

解决方案:

    1、onDestroy时清除消息。

mHandler.removeCallbacksAndMessages(null); // 参数为null时会清除所有消息。

    2、声明Handler为static并持有Activity的弱引用。

public class MainActivity extends Activity {private static final String tag = "MainActivity";private TextView mTvShow;private MyHandler mHandler;private static final int DELAY_TIME = 10000; // set to 5s and 10s to check result.
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mHandler = new MyHandler(MainActivity.this);Log.e(tag, "onCreate");mTvShow = (TextView) findViewById(R.id.tv_show);new Thread() {@Overridepublic void run() {mHandler.sendEmptyMessageDelayed(1, DELAY_TIME);Log.e(tag, "msg send");}}.start();}@Overrideprotected void onDestroy() {Log.e(tag, "onDestroy");super.onDestroy();}static class MyHandler extends Handler {WeakReference<MainActivity> mWeakActivity;//强调弱引用public MyHandler(MainActivity activity) {mWeakActivity = new WeakReference<>(activity);}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);MainActivity activity = mWeakActivity.get();Log.e(tag, "handleMessage," + msg.what);// 5s为空,10s为空-通知Activity被回收if (null == activity) {Log.e(tag, "null");} else {Log.e(tag, "not null");activity.mTvShow.setText("delay show");}}}}

转载于:https://www.cnblogs.com/Quejamais/p/5650666.html

Android中使用Handler(消息机制)造成内存泄露的分析和解决相关推荐

  1. Android使用Handler造成内存泄露的分析及解决方法

    Android使用Handler造成内存泄露的分析及解决方法 参考文章: (1)Android使用Handler造成内存泄露的分析及解决方法 (2)https://www.cnblogs.com/xu ...

  2. android的内存泄露有几种,Android中几种有可能会导致内存泄露的情况

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 1.Static静态成员导致的内存泄露 将占用大量内存空间的变量声明为static静态类型.当Activity被销毁的时 ...

  3. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...

  4. java thread 内存泄露_Java ThreadLocal 内存泄露问题分析及解决方法。

    前言 在分析ThreadLocal导致的内存泄露前,需要普及了解一下内存泄露.强引用与弱引用以及GC回收机制,这样才能更好的分析为什么ThreadLocal会导致内存泄露呢?更重要的是知道该如何避免这 ...

  5. JVM垃圾回收与一次线上内存泄露问题分析和解决过程

    前言 内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果. Java是由C++发展来的,抛弃 ...

  6. Android进阶知识树——Android Handler消息机制

    1.概述 在安卓程序启动时,会默认在主线程中 运行程序,那如果执行一些耗时的操作则UI就会处于阻塞状态,出现界面卡顿的现象,再者用户的多种操作,系统是如何做到一一处理的,系统又是如何管理这些任务的,答 ...

  7. Android Handler消息机制源码解析

    好记性不如烂笔头,今天来分析一下Handler的源码实现 Handler机制是Android系统的基础,是多线程之间切换的基础.下面我们分析一下Handler的源码实现. Handler消息机制有4个 ...

  8. 【Android】线程间通信——Handler消息机制

    文章目录 引言 Java层 永动机跑起来 示例 Looper Handler MessageQueue 永动机停下 Native层 nativeInit() nativePollOnce() nati ...

  9. Android Handler消息机制源码分析

    一,前言 众多周知, Android 只允许在主线程中更新UI,因此主线程也称为UI线程(ActivityThread). 如此设计原因有二: (1) 由于UI操作的方法都不是线程安全的,如果多个线程 ...

最新文章

  1. UITableView的cell向左滑出有删除,修改等选项
  2. 为什么硬盘速度忽快忽慢_C盘装软件会拖慢电脑速度?C盘是不是比其他盘快?...
  3. 虚拟的云服务器需要重启吗,虚拟主机重启服务器吗
  4. 计算机的两个基本能力是存储程序,【2012年职称计算机模拟题(55)】- 环球网校...
  5. java类结构工具_java类层次结构图工具
  6. jquery的鼠标移入移出事件hover、mouseenter、mouseleave、mouseover、mouseout
  7. 35解释器模式(Interpreter Pattern)
  8. Oracle坏块处理常用SQL
  9. PHP更新小程序,微信小程序Tab页切换更新数据详细介绍
  10. html js布尔值怎么定义,JavaScript基本类型值-Undefined、Null、Boolean
  11. 音视频入门-流媒体原理
  12. JDK和JRE区别是什么
  13. 关于纸张尺寸和照片尺寸
  14. 信创办公--基于WPS的Word最佳实践系列(解决Word兼容性问题)
  15. JS 格林威治时间格式(GMT)与普通时间格式的互相转换
  16. 甲骨文服务器(Oracle Cloud)开启root用户登录
  17. 【黑客故事】钢铁侠Musk的音影记录
  18. Infragistsitcs NetAdvantage WebCombo 控件
  19. Java程序设计课程——实验2
  20. codeforces 1177B

热门文章

  1. Objective-C NSString字符串操作总结
  2. Delphi自定义过程获取本机ip,名字,用户名
  3. java-List集合的源码分析(数据结构方面,源码注释方面),迭代器快速失败机制
  4. 尴尬君正,是如何被“创新”带到沟里去的?
  5. 3.调用empty而不是检查size()是否为0
  6. VMware虚拟机NAT模式网络配置图文教程
  7. 压缩命令tar cf xx.tar -C的正确用法
  8. C++ Primer 第八章 标准IO库
  9. which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mod
  10. Eclipse更改默认字符集 设置UTF-8