当前位置: 首页 > news >正文

LeakCanary简要原理

首先需要知道ReferenceQueue(引用队列):

    public static void main(String[] args) {

        Activity activity = new Activity();  // 模拟Activity

        ReferenceQueue<Activity> queue = new ReferenceQueue<>(); // 引用队列

        WeakReference<Activity> activityRef = new WeakReference<>(activity, queue); // 添加activity的弱引用到引用队列
        activity = null; // 模拟 Activity 执行 onDestroy()

        System.gc(); // 系统垃圾回收

        System.out.println("activityRef: " + activityRef.get()); // 查看 activity 的弱引用是否存在
        System.out.println("回收了: " + queue.poll()); // 查看 引用队列 的值
    }

运行结果:

我们在使用 ArrayList 的时候,new 出来往里面添加,那么List中就存在对应的值。

但是ReferenceQueue 恰恰相反,在例子中的第7行,添加activity的弱引用到引用队列后,并不会直

接加入到队列,而是等 弱引用 被回收后再加入。


LeakCanary 的原理其实就是:

使用 WeakReference 引用 Activity/Fragment 并添加到 ReferenceQueue 中 ,在

Activity/Fragment 执行 onDestroy() 后查看 ReferenceQueue(此时引用队列就应该有这个对象),若引用队列中没有相对应的值,则判定泄漏。


LeakCanary2.0及以上中,只需要添加依赖就完成了添加依赖和初始化的操作:

    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.4'

原理是运用了 ContentProvider 的特点:只需要在Manifest上注册后,在APP运行后就会执行

ContentProvider的onCreate()方法,且能够通过getContext()拿到环境

LeakCanary2.0及以上的初始化就迁移到了ContentProvider的onCreate()方法中,这样子就实现了添加依赖和初始化一步到位

相关文章:

  • 网站制作小图标/适合seo的建站系统
  • north WordPress教程/湘潭网站seo磐石网络
  • 3d建模需要什么学历/爱站seo综合查询
  • 做网站技术含量/义乌百度广告公司
  • wordpress 压缩/百度明星人气榜排名
  • 网站三网合一案例/营销型网站建设论文
  • 八、MySQL 常用函数汇总(1)
  • Java运算符(二)
  • AppScan被动手动探索扫描
  • word怎么转换成pdf?其实很简单,看这里即可!
  • 【机器学习】Java 代码实现 CART 决策树算法
  • 开关电源详解
  • 车载测试面试题一览
  • 国内最全的Spring Boot系列之六
  • Go语言初始
  • 【Spring6源码・AOP】代理对象的创建
  • Barra模型因子的构建及应用系列二之Beta因子
  • 一个关于image访问图片跨域的问题