用Leak Canary工具检测到anonymous class implements android.content.DialogInterfaces$OnClickListener

谷歌之,找到一篇文章https://corner.squareup.com/2015/08/a-small-leak.html

大段大段的英文表示没兴趣看,也看不太懂,于是咱家就一直往下拉,到fix部分:

The Startup Fix

Support only devices that use the ART VM, ie Android 5+. No more bugs! Also, no more users.

The Won’t Fix

You could also assume that these leaks will have a limited impact and that you have better things to do, or maybe simpler leaks to fix. LeakCanary ignores all Message leaks by default. Beware though, an activity holds its entire view hierarchy in memory and can retain several megabytes.

The App fix

Make sure your DialogInterface.OnClickListener instances do not hold strong references to activity instances, for example by clearing the reference to the listener when the dialog window is detached. Here’s a wrapper class to make it easy:

直接复制下面这个类

public final class DetachableClickListener implements DialogInterface.OnClickListener {public static DetachableClickListener wrap(DialogInterface.OnClickListener delegate) {return new DetachableClickListener(delegate);}private DialogInterface.OnClickListener delegateOrNull;private DetachableClickListener(DialogInterface.OnClickListener delegate) {this.delegateOrNull = delegate;}@Override public void onClick(DialogInterface dialog, int which) {if (delegateOrNull != null) {delegateOrNull.onClick(dialog, which);}}public void clearOnDetach(Dialog dialog) {dialog.getWindow().getDecorView().getViewTreeObserver().addOnWindowAttachListener(new OnWindowAttachListener() {@Override public void onWindowAttached() { }@Override public void onWindowDetached() {delegateOrNull = null;}});}
}

Then you can just wrap all OnClickListener instances:

在要用到AlertDialog的类中添加:

DetachableClickListener clickListener = DetachableClickListener.wrap(new DialogInterface.OnClickListener() {@Override public void onClick(DialogInterface dialog, int which) {//    MyActivity.this.makeCroissants();//处理PositiveButton中的事情
} });AlertDialog dialog = new AlertDialog.Builder(this).setTitle("").setMessage("")  .setPositiveButton("Baguette", clickListener).setNegativeButton(getString(R.string.update_later), new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}}).create();
dialog.show();   //原文中把show()放在clear后面,会报错
clickListener.clearOnDetach(dialog); 

The Plumber’s Fix

Flush your worker threads on a regular basis: send an empty message when a HandlerThreadbecomes idle to make sure no message leaks for long.

static void flushStackLocalLeaks(Looper looper) {final Handler handler = new Handler(looper);handler.post(new Runnable() {@Override public void run() {Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {@Override public boolean queueIdle() {handler.sendMessageDelayed(handler.obtainMessage(), 1000);return true;}});}});
}

This is useful for libraries, because you can’t control what developers are going to do with dialogs. We used it in Picasso, with a similar fix for other types of worker threads.

转载于:https://www.cnblogs.com/carrieLee/p/5396534.html

DialogInterface内存泄露 anonymous class implements android.content.DialogInterfaces$OnClickListener...相关推荐

  1. anonymous implementation of android.content.DialogInterface$OnDismissListener

    anonymous implementation of android.content.DialogInterface$OnDismissListener 内侧泄漏信息 In com.eebbk.as ...

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

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

  3. Android面试题目(10) 内存泄露

    android 中内存开发,需要很多内存泄漏的问题.最根本的原因是对象不该被GCRoots引用,可是对象被GCRoots引用到了,下面是常见的内存泄露问题: 1.InputManager 引起内存泄露 ...

  4. android oom工具,Android OOM-Heap,MAT工具检测内存泄露

    概述 在android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在google的G1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在 ...

  5. Android 内存优化——常见内存泄露及优化方案

    如果一个无用对象(不需要再使用的对象)仍然被其他对象持有引用,造成该对象无法被系统回 收,以致该对象在堆中所占用的内存单元无法被释放而造成内存空间浪费,这中情况就是内存泄 露. 在 Android 开 ...

  6. java 匿名内部类内存泄露_Android 常见内存泄露 解决方案

    前言 内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃 (OOM) 等严重后果. 那什么情况下不能被 ...

  7. android跨进程读写内存,Android 跨进程内存泄露

    内存泄露的检测和修复一直是每个APP的重点和难点,也有很多文章讲述了如何检测和修复.本篇文章 结合最近开发的项目遇到的实例,讲述下Android Binder导致的内存泄露的一个案例. 发现问题 参与 ...

  8. 全方位带你彻底搞懂Android内存泄露

    1 Java内存回收方式 Java判断对象是否可以回收使用的而是可达性分析算法. 在主流的商用程序语言中(Java和C#),都是使用可达性分析算法判断对象是否存活的.这个算法的基本思路就是通过一系列名 ...

  9. Android开发笔记——常见BUG类型之内存泄露与线程安全

    一.内存泄露 1.很抱歉,"XXX"已停止运行.OOM? 怎样才能让app报OOM呢?最简单的办法如下: Bitmap bt1 = BitmapFactory.decodeReso ...

最新文章

  1. .net 网页播放器
  2. HTML基础第三讲---字体
  3. ahjesus Ubuntu配置svn服务器
  4. JDK源码解析 迭代器模式在JAVA的很多集合类中被广泛应用,接下来看看JAVA源码中是如何使用迭代器模式的。
  5. CentOS7 编译安装LVS 互为主备 (实测 笔记 Centos 7.0 + ipvsadm 1.27 + keepalived 1.2.15 )
  6. catia怎么进入装配_CATIA教程之常见去参方法
  7. 团队软件库_深情软件库App最新版下载_深情软件库手机版2021下载
  8. android中的属性资源
  9. Solaris 网络 配置
  10. 华为荣耀立方中播放群晖nas中保存的视频
  11. SPSS——描述性统计分析——频数分析
  12. android关闭触摸提示音,修改Android系统的触摸提示音【学习笔记】
  13. 如何在ps添加箭头_照片一键自动添加烟雾特效!赠送PS动作插件 50张高清烟雾素材...
  14. ruhe调整计算机色温,显示器色温怎么调节
  15. Web前端知识——JavaScript
  16. 洛谷 P1194 买礼物 (题解+代码)
  17. SMSAlarm短信猫语音猫快速连接
  18. IOS成长之路-Nsstring中搜索方法rangeOfString
  19. 2014.10.9——Jim Foley教授讲座How real is real enough?
  20. 2021年起重机司机(限桥式起重机)考试题库及起重机司机(限桥式起重机)理论考试

热门文章

  1. 2021年起重机械指挥考试技巧及起重机械指挥试题及解析
  2. 【分享】一些很棒的在线作图网站
  3. 利用JS获取数值判断年龄
  4. mxnet手写体识别+预测
  5. Lumerical官方案例、FDTD时域有限差分法仿真学习(十一)——米氏散射 (Mie scattering 2D)
  6. Robotics system toolbox 工具箱使用案例
  7. 诸暨机器人餐厅价格_一起吃垮诸暨这家牛排自助餐厅!50+款自助,人均低至45元!...
  8. 从技术角度分析,为什么ETH PoW分叉不具备正统性?
  9. LTE Initial Attach 的过程以及相关消息的具体解析 (一)
  10. NLP常用损失函数代码实现——SoftMax/Contrastive/Triplet/Similarity