问题标签 [android-lru-cache]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 使用 LRUCache 时如何防止内存分配?
我正在为安卓移动平台开发一款游戏,一切都很顺利。但是,我现在想解决一些我在开发过程中注意到但直到现在一直被忽略的问题。
我正在使用 LRUCache 来存储带有键的 AndroidBitmap
对象。Integer
问题是,当我尝试Bitmap
使用原始类型的键将 a 存储在 LRUCache 中时int
,Integer
对象分配内存Integer.valueOf(int)
以将原始整数转换为Integer
等效的对象。
这一切都很好,但它会在我的游戏主循环的图形渲染部分导致并发垃圾收集,导致帧速率下降,当这种垃圾收集发生时,经常会产生明显的延迟。下面是我的日志的一部分,它测量了图形渲染发生所花费的时间。我的渲染方法很大程度上依赖于Bitmap
从 LRUCache 加载对象的使用,因此当分配可能非常频繁地发生时,为什么它会导致如下所示的延迟是可以理解的:
有什么办法可以Integer.valueOf(int)
在我的应用程序中分配内存?或者有没有接受原始类型的 LRUCache 的替代方法,例如int
?
android - 如何让 LruCache 只接受密钥?
LruCache
是一个映射,但我想LruCache
只缓存字符串,即我希望 LruCache 作为 HashSet 工作。
我应该如何定义一个LruCache
类?
LruCache<String, Void>
不起作用,因为当我的代码调用lruCache.put("abc", null)
,NullPointerException
时被抛出。
谢谢。
android - 使用 LruCache 在内存中存储位图
我一直在尝试在我的应用程序中实现 LruCache,但在连接点和在不同组件之间传递位图时遇到了困难。
我想知道如何在我的应用程序中集成 LruCache。我也想了解实现 LruCache 的过程,所以越详细越好
第一类是 AsyncTask Image Loader,第二类是我的自定义适配器
异步任务
自定义视图适配器类
android - 有效地绘制 Asset png 并缓存
我正在使用thquinn 的 DraggableGridView并将大约 60 个图像加载到其中。这一切都很好。我拥有资产中所需的所有图像,但想在运行时创建它们,因为首先只有图像上的文本会发生变化,这似乎是多余的,我可以减少应用程序大小,第二个原因是我有时需要更改图标添加不会成为问题但无法从资产中删除的空气,并且会占用不必要的空间。在这里简要解释一下我的动机。
所以我使用这篇文章中的方法在我的资产 png 上绘制文本,然后将其转换为位图,以便能够在 LRUcache 中使用它们。这适用于一些图像,但一旦我尝试显示所有需要的图像,我就会收到 OutOfMemory 错误。基本图像是 200x200 像素,我认为也应该根据屏幕尺寸和密度缩放到需要的尺寸。
首先,这种方法似乎效率不高,因为我创建了一个位图画布,然后制作了一个 LayerdDrawable,我再次将其制成位图(用于缓存)。不确定,但感觉就像我正在创建很多临时图像,这会使内存变得混乱。然后我使用了一个折旧的 BitmapDrawable。如果没有 BitmapDrawable,这个方法会怎样?
一般来说,我是否以正确的方式进行此操作,如何有效地使用此方法,以免出现 OOM 错误?!?
顺便提一句。当我不使用 LRUcache 并且只为 GridView 返回 LayerdDrawable 时,图像加载正常,但是在几个方向更改后我得到了异常!这是我在atm拥有的方法:
更新: 我现在尝试了另一种方法,这似乎更好,因为它没有使用 BitmapDrawable。但我仍然收到 OOM 错误。此外,它通常似乎并没有真正使用缓存的图像,当我改变方向时,只有 1 或 2 个图像来自缓存。
在 this 在 Fragment 中之前,我也没有提及。不确定是否重要。但是在纵向模式下,我只有这个片段,而在横向模式下,如果宽度允许,可以有另一个片段。
android - 如何在android中将400kb大小的位图存储到LRUCache中
在单击列表视图上的项目时,我从 sdcard 获取图像并将其存储到 LRUCache 中。图片大小为 400kb,尺寸为 750*580。但是在从缓存中检索位图时,位图为空。
这是我的代码:这里 lv 是列表视图,showpicture 是第一次从 sdcard 获取位图的方法。
android - Android缓存图像的最佳方式
我正在尝试为我的应用程序构建缓存从网络下载的图像的最有效方法,几年前我尝试这样做并且找不到有效的方法来完成这项工作,直到我偶然发现发现的惰性列表适配器这里:
这在引入 android 4.0 之前运行良好,此时应用程序会在加载 10 到 20 张图像后崩溃,而不是之前我可以简单地加载任意数量的图像而没有任何问题,后来我发现这是一个结果冰淇淋三明治对每个应用程序的内存使用设置了限制,这在 Gingerbread 2.3 及以下版本中不存在,我最终决定每隔 10 左右的图像清除一次缓存以避免崩溃,但是用户体验不是很好由于这样做,该应用程序使用了大量数据,因为它不断地一遍又一遍地重新下载已经查看过的图像,此后我尝试使用 lru 缓存,但这似乎根本不起作用,尤其是当我离开应用程序并重新启动它图像似乎都已发布,我需要一种更好的方法来做到这一点,并且我注意到其他应用程序(例如 instagram)似乎已经找到了一种缓存数百兆图像的方法,我一直不得不在我的设置中手动清除 instagram 缓存,因为它们似乎是为了能够存储似乎永远不会弹出其内容的无限大小的缓存,有人知道如何构建这种缓存吗?
android - Using LruCache and avoid OutOfMemoryException
There's an activity in my app whose showing around 1000
very small sized bitmaps (Around 20kb
each bitmap). After it loads some of the bitmaps, there's an OutOfMemoryException
.
I was first reading about SoftReference
and it looked like it will solve my problem about the OOM exceptions
. But then, I read that it won't cache my bitmaps and will free them "too soon", so it will have to decode the bitmap again and "waste" time.So, I implemented the LruCache
.
How can I make sure that I will not get OOM exception
when implementing my LruCache
?
Maybe I should just use the SoftReference, because my main target is to avoid OOM
Or, this might be my solution? LruSoftCache
bitmap - 无法在 ImagePreview 中显示全尺寸图像
我最近修改了我的相机以捕获和显示全尺寸图像,Galaxy Nexus 上的尺寸为 2592 X 1944。我在捕获图像并在预览中显示时尝试使用 LruCache。图像应该在那里是空白。我的 LogCat 上的先前条目告诉我图像已保存。
如何获得完整尺寸的图像来显示?
图片大小通过以下方式获得:
当必须为预览显示图像时,logcat 会显示以下内容:
android - 图像管理:何时回收位图?
我已经阅读了何时应该使用 LRU 缓存和其他几个问题回收位图,并且仍在与 OutOfMemoryExceptions 作斗争。但我正在超越自己。
我正在接管一个显示大量图像的应用程序。这主要是在网格视图中使用子类 ArrayAdapter 完成的。使用异步任务从 Web 加载图像,并存储在缓存中(我最终将切换到 LRU 缓存)。
网格视图中的每张图片都可以导致图像的详细视图(带有更多细节/UI 组件),这可以导致另一个网格视图。最终,堆栈上的视图太多,以至于我们的内存不足。缓存正在通过该Application.onLowMemory()
函数完全刷新图像,但尽管如此,我们的内存不足。
适配器在回收视图时从不检查缓存中是否有任何内容,我相信这可以给我一点喘息的空间,但感觉最大的收获是在 4+ 的活动中回收图像层回到堆栈中。问题是,我不确定如何做到这一点。在onPause
日常?
似乎当onPause
例程运行时(切换到下一个 Activity 层),它显示的图像仍将在缓存中,因此它们不会被回收。我是否需要拉起 Activity 堆栈并在那时对旧的 Activity 调用一些自定义例程来告诉他们回收图像?
此外,我正在尝试支持 API 级别 9-19。LRU 缓存是通过较低 API 的支持库提供的,API 12 中添加了全功能缓存,但显然如果我使用支持版本,任何运行 API 12+ 的设备都不会使用更新版本 - 我应该编写自定义代码来检测 API 版本,然后使用某种 LRUCache 工厂来创建我需要的版本?我是否需要编写自定义代码才能仅对低于 11 的 API 进行位图回收?
android - Android:跟踪缓存中的对象数量
我正在使用 ViewPager 构建画廊。每次下载照片时,我都会立即将其缓存在mMemoryCache
其中
如您所见sizeOf()
,如果使用了字节,则返回数字,这是有道理的。我的问题是我的 ViewPager 的适配器需要知道我有多少页,这将是我的缓存中的对象数。
关于我该怎么做的任何想法?谢谢!