我什么时候应该使用 LRUCache 回收位图?

2024-03-26

我正在使用一个LRUCache缓存存储在文件系统上的位图。我根据这里的示例构建了缓存:http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

问题是我在使用该应用程序时经常看到内存不足崩溃。我相信,当 LRU 缓存驱逐一个图像以为另一个图像腾出空间时,内存并没有被释放。

当图像被逐出时,我添加了对 Bitmap.recycle() 的调用:

  // use 1/8 of the available memory for this memory cache
    final int cacheSize = 1024 * 1024 * memClass / 8;
                mImageCache = new LruCache<String, Bitmap>(cacheSize) {
                @Override
                protected int sizeOf(String key, Bitmap bitmap) {
                    return bitmap.getByteCount();
                }

                @Override
                protected void entryRemoved(boolean evicted, String key, Bitmap oldBitmap, Bitmap newBitmap) {
                    oldBitmap.recycle();
                    oldBitmap = null;
                }
            };

这修复了崩溃,但也会导致图像有时没有出现在应用程序中(只是图像应该出现的黑色空间)。每当发生这种情况时,我都会在 Logcat 中看到此消息:Cannot generate texture from bitmap.

快速谷歌搜索显示,发生这种情况是因为显示的图像已被回收。

那么这里发生了什么?如果我只是在删除图像后才回收它们,为什么回收的图像仍保留在 LRUCache 中? 实现缓存的替代方案是什么? Android 文档明确指出 LRUCache 是可行的方法,但他们没有提到回收位图的需要或如何做到这一点。

解决:如果它对其他人有用,则按照接受的答案建议的解决方案是NOT执行我在上面的代码示例中所做的操作(不要回收entryRemoved() call).

相反,当您完成 ImageView 后(例如onPause()在活动中,或者在适配器中回收视图时)检查位图是否仍在缓存中(我添加了一个isImageInCache()方法到我的缓存类),如果不是,则回收位图。否则,别管它。这修复了我的OutOfMemory异常并阻止回收仍在使用的位图。


我相信当 LRUCache 驱逐一个图像以为另一个图像腾出空间时,内存不会被释放。

不会的,直到Bitmap被回收或垃圾收集。

快速谷歌搜索显示,发生这种情况是因为显示的图像已被回收。

这就是为什么你不应该在那里回收。

如果我只是在删除图像后才回收它们,为什么回收的图像仍保留在 LRUCache 中?

据推测,他们并不在LRUCache。他们在一个ImageView或其他仍在使用的东西Bitmap.

实现缓存的替代方案是什么?

为了便于讨论,我们假设您正在使用Bitmap对象在ImageView小部件,例如在 a 的行中ListView.

当你完成一个Bitmap(例如,排入ListView被回收),您检查它是否仍在缓存中。如果是的话,你就别管它了。如果不是,你recycle() it.

缓存只是让你知道哪个Bitmap物体是值得抓住的。缓存无法知道是否Bitmap仍在某处使用。

顺便说一句,如果您的 API 级别为 11+,请考虑使用inBitmap http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inBitmap. OutOMemoryErrors当分配无法完成时触发。上次我检查过,Android 没有压缩垃圾收集器,所以你可以得到一个OutOfMemoryError由于碎片(想要分配比最大的单个可用块更大的东西)。

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

我什么时候应该使用 LRUCache 回收位图? 的相关文章

  • GCM 通知的自定义 UI

    In GCM Docs http developer android com google gcm gcm html其给定 它不提供任何内置用户界面或其他处理 消息数据 GCM 只是将收到的原始消息数据直接传递给 Android 应用程序
  • 如何在 Android 中以编程方式配置启动器活动?

    我正在开发一个具有两项活动的应用程序 LoginActivity and MainActivity 当用户首次打开应用程序时 他将登录并且他的凭据 用户名和令牌 保存在Preferences 现在 如果用户再次打开应用程序MainActiv
  • 如何设置itemTouchHelper选择性滑动?

    所以我在 recyclerview rv 上实现了这个 itemtouchhelper simple 回调 现在 在这个 rv 中 我根据内容类型将 2 种布局设置为一行 因此 当我在 rv 上设置此 touchhelper 时 它正在这两
  • Android ACTION_DATE_CHANGED 广播

    我有 Nexus S 当我在手机上手动更改日期时 ACTION DATE CHANGED 并不总是被广播 如果我将日期从 2014 年 2 月 13 日更改为 2014 年 2 月 14 日 我还没有获得 ACTION DATE CHANG
  • 卡片视图工具栏

    我有一个包含 CardView 的 RecyclerView 我想向每个 CardView 添加一个工具栏 其外观和行为类似于主工具栏 图标 标题 按钮 按钮 菜单 我从这里看到了 http blog grafixartist com cr
  • Android Material主题alpha颜色问题

    我已经创建了一个构建版本为 5 0 的应用程序 我在下面编写了主题
  • 如何从另一个应用程序向一个应用程序添加视图

    我的应用程序叫做我的好应用 MyNiceApp 主要只是一个加载视图的核心coreView在主活动中onCreate coreView由用户根据需要下载的其他插件的视图填充 我定义了核心视图上的各个区域 这些区域可以通过 MyNiceApp
  • Android 可检查子菜单选项

    所以我有一个用于选项菜单项的子菜单 我想要一个可检查条目的列表 用户可以根据需要选择 取消选择多个条目 我无法解决的唯一问题是如何防止单击其中一个复选框时关闭选项菜单 我看到 PerformShortcut 有一个 FLAG PERFORM
  • 首选项活动中的广告“没有足够的空间来显示广告!需要:<480, 75>,拥有:<432, 1073741823>”

    我试图在偏好活动中展示广告 但它从未出现 Logcat 始终显示消息 没有足够的空间来显示广告 想要 有 这就是我制作广告的方式 我对广告有自定义偏好 public class AdmobPreference extends Prefere
  • 创建用于 Android 库分发的 JAR

    我正在开发一个 android 库 并希望导出一个 JAR 文件 我可以分发该文件供其他人在他们的应用程序中使用 我不想分发源代码 因为它包含有关发布到我的网络服务器的详细信息 我尝试使用在 bin 目录中创建的 JAR 文件并将该 jar
  • SDK 管理器中缺少 Google Play 服务

    我想在我的应用程序中使用 Google 地图 我想在 SDK 管理器中安装 Google Play 服务 但是当我转到 SDK 管理器时 我没有看到 Google Play 服务 为什么 我该如何安装这个 我可以独立于 SDK Manage
  • android sqlite 如果不存在则创建表

    创建新表时遇到一点问题 当我使用 CREATE TABLE 命令时 我的新表按应有的方式形成 但是当我退出活动时 应用程序崩溃 并且我在 logcat 中得到一个表已存在 如果我使用 CREATE TABLE IF NOT EXISTS 则
  • 上次更新arm64-v8a后,模拟器在M1 Mac上显示离线

    昨天模拟器运行得很好 系统镜像为arm64 v8a 我不太记得工作系统映像的版本名称 但是昨天我接受了 ARM 64 系统映像的更新 版本名称是 S 我可以从 AVD 管理器启动模拟器 当我按 运行应用程序 按钮时模拟器也会启动 但是 该应
  • 我可以在导航组件中使用多个 NavHostFragment 吗?

    如果您难以理解以下段落 请查看我制作的流程图 我目前正在制作一个带有 3 个顶级目的地的笔记应用程序 顶级目标之一 NotesList 显示用户创建的注释列表 NotesList 有一个过滤器按钮 可显示带有 FilterMenu 目标的底
  • Webview 中的 Java 空指针异常

    我试图搜索这个问题 但这个错误看起来与这个错误 https stackoverflow com questions 21866459 android nullpointerexception on webview 我的 google pla
  • Android Windows:它们何时以及如何创建?

    我已经阅读了标准的 Windows 相关文档并翻阅了 一堆源代码 试图理解 Android 如何以及何时 窗口已创建 我相信我已经拥抱它并愿意 对其进行验证或更正 据我所知 只有两种方法可以获得 Window 对象的句柄 1 Activit
  • 随着速度变化,速度表针规绕其中心旋转

    Hi all 我编写了一个应用程序 其中有一个速度计 其指针垂直设置为 90 度 我试图以每秒变化的速度绕其中心旋转指针 我在文本视图中显示变化的速度 从 0 到 120 随机 我正在从远程服务获取速度并显示在文本视图中 因此 当速度发生变
  • Android进程调度

    我试图更好地理解 以便在创建 Android 应用程序 服务时确定潜在的互操作性问题对可靠性的影响 我想弄清楚进程优先级是如何确定的 服务和活动之间优先级的差异以及调度程序是否以不同方式对待它们的优先级 基本上 我试图深入了解某个活动或服务
  • 更改 Android 中突出显示文本的颜色

    我不确定这是否可能 也许有人可以纠正我 我在 Android 应用程序中有一个 EditText 视图 该视图在蓝色背景上有白色文本 当选择文本时 通过长按和编辑对话框 我希望突出显示为白色并将文本颜色更改为黑色 令人烦恼的是 似乎没有办法
  • 如何检测文本是否可读?

    我想知道是否有一种方法可以告诉给定的文本是人类可读的 我所说的人类可读的意思是 它有一些含义 格式就像某人写的文章 或者至少是由软件翻译器生成的供人类阅读的文章 这是背景故事 最近我正在制作一个应用程序 允许用户将短文本上传到数据库 在部署

随机推荐

  • 后台任务SystemTriggerType.SmsReceived不会触发

    我正在后台 Windows Phone 8 1 中测试任务 但触发器SystemTriggerType SmsReceived不适合我 有人设法让它发挥作用吗 I used 这个例子 http code msdn microsoft com
  • "" 和 " " 之间有什么区别,如何根据字符测试前者?

    在Java中 空引号 和 带有单个空格的引号 之间有什么区别以及如何测试前者char 代表空字符串 is not空 它包含一个空格字符 你不能用以下方式来测试前者char 因为没有字符 用 a 来测试它String 它是String长度为零
  • 获取add_subdirectory添加的CMake项目版本

    我有一个依赖于 Google Test 库的 CMake 项目 我已经使用添加了 Google 测试ExternalProject Add and add subdirectory如此处所述 https github com google
  • jasig cas 重定向过多问题

    我正在尝试使用 spring security 和 spring security cas 带有 Jasig CAS 的 SSO 来保护 spring boot Web 应用程序 尝试访问受保护的资源时 我遇到了太多重定向错误 该项目可用h
  • 使用兆秒差距在不同位置出现多个错误

    我将使用 megaparsec 来解析大学项目的编程语言 但是 我寻找一种报告多个错误的方法 我知道 withRecovery 并且我看到了this https github com mrkkrp megaparsec issues 43问
  • PLSQL:使用合并语句时获取更新与插入的记录数

    无论我的记录如何使用 SQL ROWCOUNT 插入或更新 合并都会始终为您提供合并的记录数 但是如何找出实际插入的记录数与实际更新的记录数 我尝试了这篇文章中的选项 但这似乎不起作用 https asktom oracle com pls
  • Python - 在应用程序中直接显示网络浏览器/iframe

    我有一个脚本 如果对人们回答问题有帮助 那就使用 kivy 我想让它在运行时直接显示 iframe 之类的东西 而不是打开 浏览器 例如这样的事情 def browser url google com iframe url browser
  • 远程连接clearDB heroku数据库

    我如何使用 MySQL 查询浏览器等在 heroku 上远程连接到 ClearDB MySQL 数据库 从哪里获取 url 端口 登录名和密码 在 heroku 网站中 转到 我的应用程序 并选择已安装 ClearDB 的应用程序 在顶角单
  • 稀疏矩阵-矩阵乘法

    我目前正在使用稀疏矩阵 并且必须将稀疏矩阵 矩阵乘法与全矩阵 矩阵乘法的计算时间进行比较 问题是稀疏矩阵计算比全矩阵计算慢得多 我正在使用压缩行存储来压缩我的矩阵 并且将两个矩阵相乘非常耗时 四倍for循环 所以我想知道是否有更好的压缩格式
  • Highchart 日期选择器

    我正在尝试让 jquery ui datepicker 与 highcharts 一起使用 以便用户可以选择一个日期 例如 用户选择 10 月 10 日至 10 月 25 日 用户选择日期后 高图应重新绘制并显示已完成的项目的小时数以及任务
  • jQuery tablesorter 如何找到 sortList 对象

    我正在使用 jQuery 表排序器插件 我想存储用户如何对页面上的表格进行排序 并在下次加载页面时自动按这种方式排序 为此 我首先需要能够找到存储表排序方式的 sortList 对象 对于我的一生 我不知道如何获得它 该文档似乎没有任何相关
  • 尝试让一个对象查看 Unity 中的另一个对象

    嗨 我一直在尝试让对象 Tower 查看对象 Enemy 但是我收到错误 非静态字段 方法或属性 Enemy position 需要对象引用 这是敌人的类 我试图在其中定义敌人的位置以供塔参考 有谁知道如何解决这个问题 谢谢 public
  • 将 SpellCheck.IsEnabled 添加到控件后,WPF 表单加载速度非常慢

    所以我有一个神秘的问题 在我添加之后SpellCheck IsEnabled对于我的其中一个控件 承载该控件的表单需要 3 秒以上的时间才能加载 删除拼写检查属性 表单会立即加载 仅供参考 以下是表格中唯一更改的地方
  • 在 Python 3.5 而不是 2.7 上运行 Django 1.9

    我在 OSX 10 10 上运行 Python 2 7 和 3 5 还有 Django 1 9a 这两个版本都支持 Python 问题是我想在 Python 3 5 而不是 2 7 上运行 Django 在某些线程上 我发现了通过包含 Py
  • 生成传出 URL 时选择了意外的路由

    请考虑以下路线 routes MapRoute route1 controller month year action user routes MapRoute route2 controller month year action 以及以
  • ColdFusion 8中是否有类似于ColdFusion 9中的ArrayFind的功能?

    我在工作中与另一位程序员同事交谈 我们使用 ColdFusion 他告诉我只需在数组中查找一个值我必须执行整个循环 ColdFusion 8 中是否真的没有函数可以简单地在数组中查找值 arrayFind ColdFusion 8 中不存在
  • 从 mongoDB 中删除文档

    这可能是一个非常愚蠢的问题 但我是 MongoDB 的新手 所以请耐心等待 我创建了一个独立的红宝石类 require rubygems require mongo require bson require mongo mapper Mon
  • 如何计算Java中的时差?

    我想从 19 00 00 减去两个时间段 例如 16 00 00 Java 有没有这个功能 结果可以以毫秒 秒或分钟为单位 Java 8 有一个更清洁的解决方案 https docs oracle com javase 8 docs api
  • 从 std::cout 或 std::ofstream(file) 获取 std::ostream

    我如何绑定std ostream到任一std cout或到一个std ofstream对象 取决于特定的程序条件 尽管由于多种原因这无效 但我希望实现语义上与以下内容等效的东西 std ostream out condition std c
  • 我什么时候应该使用 LRUCache 回收位图?

    我正在使用一个LRUCache缓存存储在文件系统上的位图 我根据这里的示例构建了缓存 http developer android com training displaying bitmaps cache bitmap html http