了解 Android 应用程序中的内存泄漏

2024-03-14

我找到了这篇文章“避免内存泄漏” http://android-developers.blogspot.it/2009/01/avoiding-memory-leaks.html,其中据说有以下代码:

private static Drawable sBackground;

@Override
protected void onCreate(Bundle state) {
  super.onCreate(state);

  TextView label = new TextView(this);
  label.setText("Leaks are bad");

  if (sBackground == null) {
    sBackground = getDrawable(R.drawable.large_bitmap);
  }
  label.setBackgroundDrawable(sBackground);

  setContentView(label);
}

这不是一个好主意,因为:

当屏幕方向改变时,系统默认情况下, 销毁当前活动并创建新活动,同时保留其 状态。这样做时,Android 将从以下位置重新加载应用程序的 UI: 资源。

所以上面的代码:

...泄漏在第一个屏幕方向更改时创建的第一个活动。当 Drawable 附加到视图时,该视图是 设置为可绘制对象的回调。在上面的代码片段中,这 意味着drawable有一个对TextView的引用,它本身有一个 对活动(上下文)的引用,而该活动又具有引用 几乎任何东西(取决于你的代码。)

但是,当屏幕方向改变时,该方法setBackgroundDrawable(可绘制背景) http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.3_r1/android/view/View.java#View.setBackgroundDrawable%28android.graphics.drawable.Drawable%29被调用,进而调用:

background.setCallback(this);

方法Drawable.setCallback()定义如下:

public final void setCallback(Callback cb) {
    mCallback = new WeakReference<Callback>(cb);
}

因此,现在后台应该释放对先前 TextView 的旧引用,并应创建对新 TextView 的新引用。

因此,似乎更改屏幕方向只会在新创建活动之前泄漏引用。

我哪里出错了?


你是绝对正确的。不过,有一个微妙的地方:该文章来自2009。当时,实施setCallback was :

安卓

public final void setCallback(Callback cb) {
    mCallback = cb;
}

安卓 >= 4.0.1:

public final void setCallback(Callback cb) {
    mCallback = new WeakReference<Callback>(cb);
}

Grepcode shows no source code of intermediate versions, this is the only diff I could quickly find.


所以,再说一遍,在这种特定情况下你是绝对正确的(如果你的目标是> 14)。然而,真正考虑当您保留对此类项目的静态引用时实际发生的情况(就像您所做的那样)仍然非常重要。在很多情况下,您肯定可能会泄露Context.

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

了解 Android 应用程序中的内存泄漏 的相关文章

  • JavaFX 动画使用循环?

    我正在尝试制作一款类似太空侵略者的游戏 我画了一个正方形 我想通过使用循环逐步向下移动它thread sleep 然而 正方形立即被绘制出来 我知道有可以使用的动画路径 但我想保持低水平并仅使用坐标系 有没有办法使用这样的循环来制作时间轴动
  • Android imageview 改变色调来模拟按钮点击

    我有一个图像视图 我在其中设置了从网址获取的位图 在 imageview 上 我设置了一个 onClickListener 来打开一个对话框 当按下图像视图时 我想以某种方式改变色调 使其更暗 以提供一种类似按钮点击的感觉 你有什么建议 h
  • 为什么 Casbah / Java MongoDB 驱动程序最终会出现 java.lang.IllegalArgumentException?

    我使用时看到一个奇怪的问题casbah java driver 当驱动程序尝试从 mongo 创建响应时 我不断遇到以下异常 Oct 16 2012 10 45 07 AM com mongodb DBTCPConnector MyPort
  • gradle 复制为 doLast 不起作用

    我正在尝试做一件非常简单的事情 由于 gradle 在清理时会删除构建目录中的所有文件 因此我想在创建发布版本时将 apk 移至其他位置 所以我在链中添加了一个复制任务 并将其设置为最后一个 我尝试过的任何方法都不起作用 所以我简化了它并添
  • 蓝牙权限在 jetpack compose 中无法正常工作

    我在用com google accompanist accompanist permissions 0 25 1在我的项目中 我正在尝试在运行时请求蓝牙权限 我想知道用户如何知道权限被永久禁用 清单 xml
  • 未从线程接收位置数据

    我尝试使用计时器经常发送包含用户位置的短信 最初 我遇到了空指针异常 这是由于我犯了一个简单的错误 一旦解决了这个问题 一切似乎都运行良好 但是 它永远不会获取我的位置 因此 不断发送的文本显示 无法接收位置 我想问的是为什么它无法获取我的
  • Android - 框架布局高度与协调器布局不匹配

    我的 FrameLayout 抽屉布局中的容器 有问题 FrameLayout的高度超过了屏幕高度 在底部的android默认菜单按钮下方
  • APACHE POI 从 Java 中的 Excel 获取精确的字体颜色

    在 Excel 工作表中 如何使用 Java 中的 Apache POI 获取准确的字体颜色值 我试图通过使用来获取字体颜色 org apache poi ss usermodel Font f book getFontAt style g
  • 使用 Lint 和 SonarQube 分析 Android 项目

    我真的 溢出 了试图让这些东西一起工作 我按照这里的指示进行操作 http docs sonarqube org display PLUG Android Lint Plugin http docs sonarqube org displa
  • Android facebook api,获取不同尺寸的头像

    我正在使用相对较新的 Facebook 图形 api 我正在获取使用该应用程序的朋友列表及其个人资料照片 我不知道如何修改我发送的参数 以便返回的图片很大 当前返回的默认值很小 我正在使用 newMyFriendsRequest 我发送的参
  • Android 以编程方式停止 toast 通知?

    有没有办法以编程方式停止 Toast 消息 假设我有一个按钮 单击它可以滚动 toast 消息 并且在 onclick 事件中我想停止队列中的所有消息并只显示新消息 我该怎么做 我的代码的简化版本如下 代码 public class Hel
  • 错误:列“this_.phitorsionangle”必须出现在 GROUP BY 子句中或在聚合函数中使用

    我在执行 sql 查询时遇到了一些问题 我正在使用 Hibernate Criteria 来构建查询 我通过按一定间隔 binSize 舍入值然后对它们进行分组来从数据库创建一些容器 当我直接在 SQL 中使用查询尝试时 效果非常好 SEL
  • Android minSdkVersion 与 Flutter(v2.8.1)

    我已经安装了 firebase 包 据我们所知minSdkVersion 19被推荐 所以 我想做这个过程 但是 我看到这一行包含在android app build gradle file minSdkVersion flutter mi
  • JSF“总”变量类似于 JSTL 中的 c:set

    我不喜欢 JSF 但我需要用它来解决这个问题 我正在 纯 JSF 中工作 所以这就是我基本上需要的 但我不知道如何用 JSF 来实现它
  • 如何更改区域设置以使用拉丁塞尔维亚语(而不是西里尔塞尔维亚语)

    塞尔维亚语有拉丁字母和西里尔字母 在 Android 的日期和时间选择器小部件中 显示的塞尔维亚语言区域字母似乎是西里尔字母 如此处所示 我想更改区域设置 以便 Android 小部件使用拉丁塞尔维亚字母 当前的语言 国家代码 产生西里尔字
  • 解析 SWIG 接口文件的结构属性

    这是我不久前问过的问题的延续 为通过参数返回的函数创建类型映射 https stackoverflow com questions 12793973 create a typemap for a function that returns
  • 为什么我的 Java 路径中添加了“L”?

    我在我的类路径中加载了一个 jar 在 iReport 中 如果重要的话 我确信它具有所需的方法 但是当我尝试测试连接 从而调用该 jar 时 我得到一个 java lang NoSuchMethodError 说它正在引用班上 Lorg
  • 需要同步仅增量计数器吗?

    我使用整数作为计数器 该整数只会增加 并且肯定有多个线程会同时增加它 当没有其他线程尝试访问其值时 在程序执行结束时读取该计数器的值 我假设我不必为这种仅增量计数器使用锁或任何类型的同步 这是正确的吗 如果这有什么区别的话 我用 Java
  • 如何使用 Kafka 发送大消息(超过 15MB)?

    我发送字符串消息到Kafka V 0 8使用 Java Producer API 如果消息大小约为 15 MB 我会得到MessageSizeTooLargeException 我尝试过设置message max bytes到 40 MB
  • 如何获取 res.drawable 文件夹的路径来复制文件?

    我正在编写我的应用程序AndroidStudio 我的里面有gif文件drawable gifs文件夹 我希望将该文件复制到MediaStore Images Media单击按钮后的文件夹 目前 即使使用发布的一些答案 我也无法获取我的 g

随机推荐

  • 常量 Flask 会话 ID

    I ve a Flask应用程序 使用 Nginx WSGI FastCGI 和 Gevent 提供服务并使用标准 Flask 会话 我愿意not使用session permanent True或任何其他额外选项 但只需设置SECRET K
  • 在 Python 中打印“批准”符号/复选标记 (✓) U+2713

    如何在Python中打印复选标记 这是批准的标志 而不是平方根 您可以使用转义序列打印任何 Unicode 字符 确保创建一个 Unicode 字符串 print u u2713
  • git 中预推送和预接收钩子的区别?

    git 中的预推送和预接收钩子在用例或工作逻辑方面有区别吗 我能理解的唯一区别是他们文档 https github com git git blob master Documentation githooks txt L211就他们收到的输
  • 是否可以定义相互依赖的类型并在单独的文件中定义?

    我正在尝试实现一个具有扩展解析功能的库 我决定使用 fsyacc 因为我从大学就知道它 不幸的是我遇到了以下问题 我为我的语法头部定义了一个类 Head 并将其实现放在一个文件中 然后我将解析器定义为 start head type hea
  • 最小元素错误

    我不是 C 编码员 所以也许这很容易 我有一个 Point 类向量 我想找到 AABB 矩形 最小 x 最小 y 最小 x 最大 y 最大 x 最小 y 最大 x 最大 y 我已经完成了一个 for 循环 保存最小值和最大值 一次用于 x
  • 强制链接与库不同的 SONAME

    如何以与具有冲突 SONAME 的库的两个现有版本兼容的方式链接二进制文件 这两个版本不共享相同的 SONAME 前缀 一个是 libcapi10 so 3 另一个是 libcapi10 so 4 我无法重新编译它们 因为我将它们作为二进制
  • 在Python中反转列表切片

    我试图在 python 中反转列表的切片 但它返回一个空列表 但是当我尝试使用整个列表时 它工作得很好 我在这里错过了什么吗 l 1 2 3 4 5 6 7 8 l 1 8 7 6 5 4 3 2 1 lt lt lt This worke
  • Flink CEP:对于不同类型的事件,使用哪种方法加入数据流?

    假设我有两种不同类型的数据流 一种提供天气数据 另一种提供车辆数据 我想使用 Flink 对数据进行复杂的事件处理 Flink 1 3 x 中哪种方法是正确的使用方法 我看到了不同的方法 如 Union Connect Window Joi
  • 获取 iframe 的源代码

    有没有办法获取 iframe 加载的页面的源代码 我不想更改任何代码 我只想阅读它 我还需要能够使用 javascript html 来获取它 document getElementById iframeID contentWindow d
  • Swift 2 中“kGMSMarkerAnimationPop”错误的使用不明确

    我在尝试为 GMSMarker 制作动画时遇到错误 我已遵循 Google 文档和各种指南 但它不断返回错误 下面是我的代码 func placeMarker coordinate CLLocationCoordinate2D if loc
  • g++ 链接问题:对函数的未定义引用

    我使用 CMake 和 Visual C 构建 HyDE 库 然后 仍然在 VC 中 我能够成功创建代码并构建链接到 HyDE lib 和 HyDE 头文件的可执行文件 然后我发现 为了与我公司的其他人一起工作 最好在 Eclipse CD
  • 复选框树

    我正在寻找 Javascript 的 复选框树 小部件 我尝试使用jquery 检查树 http jquery checktree googlecode com 其声称完全符合我的要求 但它存在以下问题 它无法识别已选中的复选框 并将所有内
  • 查找用户是否是 Active Directory 组 ASP.NET VB 的成员?

    我正在使用 Active Directory 对 Intranet 站点的用户进行身份验证 我想根据用户在 Active Directory 中所在的组来优化经过身份验证的用户 有人可以向我展示或指出如何在 ASP NET 4 0 VB 中
  • 在 Angular 2 中使用 ngForTemplate 时绑定事件

    假设我有这个简单的列表渲染组件 import Input Component from angular2 core Component selector my list template div item div class MyList
  • 为什么编译器会优化掉由于 strncmp() 而导致的共享内存读取,即使使用了 volatile 关键字?

    这是一个程序foo c将数据写入共享内存 include
  • 角度结构指令上下文模板类型检查

    我似乎无法使角度模板自动完成工作 任何人都可以帮助我理解我错过了什么或做错了什么吗 div xd item div 我几乎继续研究 ngIf 和异步管道源代码 试图了解正在发生的事情 并制定了这个简单的指令 只是为了方便我的异步订阅生活 这
  • 与 Boost 和 ncurses 的静态链接

    我正在制作一个基本的角色扮演游戏 我想静态地包含 Boost 库 以便运行我的游戏的人不需要拥有它们 我研究并查找了所有你需要做的就是添加 static到命令行编译 所以我的命令是这样的 g static o karthas o lncur
  • 如何阻止不良的身份不明的机器人爬行我的网站?

    我怎样才能抵御不良的不明机器人爬行我的网站 一些名称未出现在 Apache cPanel 中的恶意机器人正在严重访问我的网站带宽 我曾在 batgap com robots txt 上尝试过 robots txt 也使用 htaccess
  • 在 boto3 1.5.36 上使用 S3.Object().put() 在 S3 中存储 matplotlib 图像

    除其他事项外 我正在使用绘图matplotlib 我想立即将其存储为 S3 对象 根据中提供的答案this https stackoverflow com q 33771318 1129682 and 这个其他 https stackove
  • 了解 Android 应用程序中的内存泄漏

    我找到了这篇文章 避免内存泄漏 http android developers blogspot it 2009 01 avoiding memory leaks html 其中据说有以下代码 private static Drawable