Android |双锁单例模式中使用Context如何避免内存泄露的 Warning 提示

2023-11-15

文章目录


问题

在Android开发中,经常会将工具类以单例模式的方法实现,而工具类中又总不可避免的用到 Context ,例如:

public class MySingleton {
    private static volatile MySingleton instance;
    private final Context ctx;

    private MySingleton(Context context) {
        ctx = context;
    }

    public static MySingleton getInstance(Context context) {
        if (instance == null) {
            synchronized (MySingleton.class) {
                if (instance == null) {
                    instance = new MySingleton(context);
                }
            }
        }
        return instance;
    }
}

那么就会出现:

Warning: Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run)

包括 Google 自己的单例模式使用举例都会有这个错误……

解决方法

这是因为普通 ActivityContext 的生命周期未必有 final Context ctx(实际上是static MySingleton) 长,因此有内存泄漏的风险。

查阅了大量资料后,解决方法主要参考这里,最终的代码实现如下:

public class MySingleton {
    private static volatile MySingleton instance;
    private final Context ctx;

    private MySingleton(Context context) {
    	// 调用 getApplicationContext()
    	// 返回当前进程的单个全局应用程序对象的上下文。
    	// 这意味着 getApplicationContext() 返回的上下文将贯穿整个程序
        ctx = context.getApplicationContext();
    }

    public static MySingleton getInstance(Context context) {
        if (instance == null) {
            synchronized (MySingleton.class) {
                if (instance == null) {
                    instance = new MySingleton(context);
                }
            }
        }
        return instance;
    }
}

拓展

Android设计模式(一)单例模式

单例模式双重锁中volatile的作用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android |双锁单例模式中使用Context如何避免内存泄露的 Warning 提示 的相关文章

随机推荐

  • go环境安装与idea goPATH设置

    1 找到中文go网站安装go环境 http docscn studygolang com doc tutorial getting started
  • Qt应用程序允许使用高地址内存的设置

    1 Qt4版本 在 pro文件中添加以下代码 申请使用高位地址内存 QMAKE LFLAGS Wl large address aware 2 Qt5版本 在 pro文件中添加以下代码 允许使用高位内存 QMAKE LFLAGS WINDO
  • Cocos Creator搞心态小游戏-闯关类 项目展示+完整项目源码

    游戏录像 Cocos Creator搞心态小游戏 闯关类 项目展示 游戏玩法 玩家通过按方向键控制角色移动 跳跃并躲避场景中的陷阱 角色触碰到陷阱会往后摔 直到角色到达摔到安全位置 功能 角色的基本移动前后移动 跳跃 角色触碰陷阱会往后摔
  • centos 7设置redis开机自启

    Linux设置redis开机自启 查询redis conf配置文件的路径 find name redis conf 设置redis conf中daemonize为yes 确保守护进程开启 当Redis以守护进程方式运行时 Redis默认会把
  • SpringBoot 整合 XXL-JOB(执行器)

    合集地址 pom 引入相关依赖 版本要和注册中心对应
  • Matlab - Solidworks 机器人建模(3)如何把URDF文件导入到Matlab

    文章目录 0 前言 1 URDF 转化成 rigidbody tree格式 2 URDF 导入到 simulink 有了urdf文件之后 在matlab里面可以有这两种导入选择 urdf 转化成 rigidbody tree urdf 转化
  • 基础算法【算法习题及模板】上

    目录 排序 快速排序 归并排序 二分 高精度 高精度加法 高精度减法 高精度乘法 高精度除法 排序 快速排序 给定你一个长度为n的整数数列 请你使用快速排序对这个数列按照从小到大进行排序 并将排好序的数列按顺序输出 输入格式 输入共两行 第
  • Linux 查看或统计网卡流量的几种方式【全】

    在工作中 我们经常需要查看服务器的实时网卡流量 通常 我们会通过这几种方式查看Linux服务器的实时网卡流量 目录 1 sar 2 proc net dev 3 ifstat 4 iftop 5 nload 6 iptraf ng 7 ne
  • 我国网民上网最爱干三件事:娱乐聊天看新闻

    中国互联网信息中心 CNNIC 今日发布第24次中国互联网发展状况统计报告 报告显示 我国网民上网最干的三件事分别是 娱乐 聊天 看新闻 报告称 我网民在网络娱乐 信息获取和交流沟通类网络应用上使用率较高 除论坛 BBS外 这三类网络应用在
  • 27条好赚钱副业的途径:自己也能不用上班月入2万+!

    前言 最近我的知乎号也是越做越好了 很多读者私聊我有没有副业可以做 自己平常除本职的工作之外 也会去做一些其他事情 写公众号 搞搞小视频 偶尔还接点小私活 平常还收了几个小徒弟 然而知乎上很多非相关互联网的也给我咨询了好的 不得不说自己还需
  • 基于孪生网络的单目标跟踪持续汇总

    基于Siamese Network的单目标跟踪持续汇总 Visual Object Tracking 从SiamFC开始 涌现了一大批基于孪生神经网络 Siamese Network 的跟踪算法 其中包括多目标跟踪和单目标跟踪 本文将以Si
  • 51单片机用三种方法实现流水灯(超详细)

    51单片机用三种方法实现流水灯 一 数组流水灯 二 移位函数流水灯 三 移位运算符流水灯 一 数组流水灯 定义一组数组分别对应点亮LED1 7 然后利用for循环赋值给p2从而实现流水灯 include
  • 微信用户的 openid 可能会在以下几种情况下发生变化

    微信用户的 openid 可能会在以下几种情况下发生变化 1 用户重新安装微信应用后 会获得一个新的 openid 2 用户在同一设备上切换微信账号后 该设备上存储的 openid 会刷新 3 微信用户设置了 清除缓存 后 也会获得新的 o
  • 项目2-年收入判断

    文章目录 项目2 年收入判断 友情提示 项目描述 数据集介绍 项目要求 数据准备 环境配置 安装 Logistic回归 数据准备 一些有用的函数 梯度与损失 模型训练 绘制损失和精度曲线 预测测试标签 多变量生成模型 数据准备 平均值和协方
  • 概率图模型(PGM):贝叶斯网(Bayesian network)初探

    1 从贝叶斯方法 思想 说起 我对世界的看法随世界变化而随时变化 用一句话概括贝叶斯方法创始人Thomas Bayes的观点就是 任何时候 我对世界总有一个主观的先验判断 但是这个判断会随着世界的真实变化而随机修正 我对世界永远保持开放的态
  • 三层交换机配置OSPF动态路由

    一 建立拓扑图 二 配置主机IP地址 网关 主机号 IP地址 网关 PC 0 192 168 10 101 192 168 10 1 PC 1 192 168 20 101 192 168 20 1 PC 2 192 168 30 101
  • 在IDEA中建好了一个Maven项目后,启动Tomcat,IDEA控制台输出乱码问题的改善

    前言 当我们在IDEA中新建一个Maven项目后 启动Tcomcat访问指定网页时 在IDEA控制台的output窗口会出现中文乱码的情况 对一些人来说 这样看起来很不舒服 为什么会出现这个问题呢 怎样解决这个问题呢 原因 Tomcat的配
  • gorm操作数据库

    gorm官方学习链接 操作总结 func deploy DeploymentConf Get application server instance string error err DB Table DEPLOYTABLENAME Whe
  • ubuntu18.04安装mosquitto及使用

    1 安装 sudo apt add repository ppa mosquitto dev mosquitto ppa sudo apt get update sudo apt get install mosquitto sudo apt
  • Android |双锁单例模式中使用Context如何避免内存泄露的 Warning 提示

    文章目录 问题 解决方法 拓展 问题 在Android开发中 经常会将工具类以单例模式的方法实现 而工具类中又总不可避免的用到 Context 例如 public class MySingleton private static volat