问题标签 [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.

0 投票
4 回答
3813 浏览

android - 如何防止LRU缓存android中的内存不足错误

我已经使用内存 LRU 缓存在我的 android 应用程序中缓存位图。但是在将一些位图加载到 LRU 地图应用程序强制关闭后说内存不足异常。我已经花了一整天的时间,但还没有找到解决方案,请任何人都可以帮助我,我严重陷入了这个问题。在此先感谢。

这是我的代码

0 投票
1 回答
1080 浏览

android - 如何将 android LRU 缓存与来自我的服务器的图像一起使用

我正在尝试了解如何使用 android LRU 缓存,以便我可以在我的应用程序中使用它。

我有一个关于图像的应用程序。一个活动显示图像的 GridView,另一个显示全屏图像,除了这两个活动之外,图像还以各种其他方式使用。现在大约 85% 的图像来自我的服务器。所以我关于 LRU 缓存的问题是:我是否将图像直接从服务器加载到 LRU 缓存中?或者我是否将图像从服务器加载到我的应用程序的磁盘空间中,然后在需要时将这些本地存储的图像加载到 LRU 缓存中?

我困惑的原因是这样的。我的应用大约 15% 的图像使用来自用户的本地设备,应用通过意图获取

显然我可以将从本地图像文件夹中获得的这些图像加载到 LRU 缓存中。在我阅读 LRU 缓存之前,我的印象是这些本地图像实际上已经被缓存了。无论如何,我的计划是只缓存我从服务器获得的图像。但是我想知道我是否应该将它们存储在我的应用程序的内部存储中,然后按需将它们传递给 LRU 缓存,或者 LRU 缓存是否已经为我处理了存储。换句话说,如果我的应用程序被杀死,是否会导致 LRU 缓存清空?重申我的担忧,我希望从服务器获得的图像能够在崩溃和应用程序被杀死时幸存下来。那么 LRU 缓存本身是否适合这种情况,或者我应该将图像存储在磁盘上,然后根据需要加载 LRU 缓存?

0 投票
1 回答
177 浏览

android - BitmapFun 过于激进地对我的图像进行下采样

我正在使用培训材料中的 BitmapFun 在 GridView 中显示我的图像。但是代码返回的图像非常模糊。ImageResizer我在方法类的第 184 行跟踪了罪魁祸首之一decodeSampledBitmapFromDescriptor

这是实际的方法

所以我想要的是不要那么激进地采样。但这会导致一些问题:既然这是加载位图的官方建议,那么将采样更改为不那么激进有什么问题?有没有人不得不更改此代码以获得更好质量的图片?我的调查是否正确?即这段代码是我的图像模糊的原因吗?这不是问题/疑问的详尽清单,但这应该让读者对我的担忧有所了解。最后:如何在不影响 BitmapFun 目的的情况下解决这个问题?显然,我去 BitmapFun 是有原因的:我的应用程序运行不正常并且经常崩溃。现在它没有崩溃,但图像太模糊了。

0 投票
1 回答
368 浏览

android - Android缓存网络响应一定时限

我目前正在使用 HttpClient 执行返回 JSON 对象的网络请求。我想缓存返回的数据并将缓存数据设置为十分钟的到期时间。

我研究过使用 LruCache、SQLite 和共享首选项。执行此任务的最佳方式是什么?我目前正在为我的应用程序的其他部分使用 SQLite 数据库,所以我只是在考虑使用它并比较缓存数据时的时间戳。该选项对我有用,但似乎有点矫枉过正,因为该表中始终只有一行。

任何建议都会有所帮助。谢谢!

0 投票
1 回答
528 浏览

android - LRUCache 未按预期工作

以下示例显示,在 LRUCache 之外分配新空间时,使用有限大小的 LRUCache 会导致 OutOfMemory 错误。

属性:64MB 进程大小;10MB LRUCache 大小;我循环放入 LRUCache 的 1MB 块。

经过 57 次(64MB - 7MB)尝试后,我得到:

在 lrucache.evictall() 之后,缓存被释放并且有足够的空间再次分配。但我想这不是办法。

有什么提示吗?

这是我的代码:

0 投票
1 回答
364 浏览

android - LruCache 不适用于 imageAdapter

我的资源中有 11 张图片。我使用 GridView 来显示它们。

因为图像在我的 ImageAdapter 类中占用大量空间,所以我计算样本大小,然后按照此处的教程解码资源以有效加载图像。

在我返回解码的位图之前,我将decodeSampledBitmapFromResource位图添加到 LruCache :

如果它不为空,这导致我getView()尝试获取缓存的位图 - 否则使用我上面提到的方法。

为了从缓存中添加和获取位图,我正在使用:

发生的事情if ( cachedBitmap != null )从来都不是真的,这让我相信有些事情是错误的。

类的完整代码:

}

0 投票
1 回答
781 浏览

android - 安卓 lrucache

我使用代码android lrucache 示例(内存缓存)来缓存下载的图像(总共近 120 KB)并且它可以工作,但是当我从活动(或应用程序)出去时,缓存被删除,当我再次去活动时它再次下载并缓存图像。

请告诉我:如果我可以使用 lrucache 存储数据近 5 天(近 1mb),或者如果不能,我可以使用 DiskLruCache 吗?先感谢您。

0 投票
0 回答
452 浏览

android - 在类中使用 DiskLruImageCache

我正在尝试按照这个答案来缓存我需要在列表视图中显示的位图。但是没有任何地方提到如何在课堂上使用它。谁能给我一个关于如何DiskLruImageCache在课堂上使用的示例代码?

编辑

这是我尝试过的。我有很多活动,所以我使用了一个名为Model. 我创建了内部模型类的实例,DiskLruImageCache并在第一个活动的 onCreate 上初始化对象,如下所示:

然后我在类中有这两种方法Model来存储和获取位图:

然后在我需要存储图像的课程中,我这样做:

为了得到它,我使用:

但我没有得到位图。然后我尝试调试并发现图像正在存储在缓存中,因为DiskLruImageCache.java当我尝试保存位图时正在执行以下操作。

这意味着图像被缓存。但是当我试图获取位图时,以下内容正在执行DiskLruImageCache.java

然后我"mykey"使用 incontainsKey(String key)方法检查了用于存储位图的键是否在缓存中DiskLruImageCache.java,但它也返回 false。甚至我用来存储位图的密钥也不存在,它正在被存储。我在做什么有什么问题吗?因为我发现很多人都从答案中得到了正确的工作。我在这里做错了什么?如何纠正这种情况?

0 投票
1 回答
311 浏览

android-lru-cache - 实现 LruCache

我正在尝试在我的程序中实现 Lru Cache 以使我的列表视图滚动得更快。我不知道在 addBitmapToCache(String key, Bitmap bitmap (由 XXXXXX 表示) 的 Bitmap 值中放置什么。有人有建议吗?谢谢。

这是我实现它的地方。

0 投票
1 回答
841 浏览

android - 实现全局 LruCache 与许多本地 LruCache

我的应用程序中的几个Activitys 在 a 中显示图像,ListView其中的每一行都ListView包含一个ImageView.

这方面的一个示例是搜索屏幕,用户在其中搜索、获取结果并显示每个结果的图片。

我正在尝试权衡实施全局LruCache与每个都Activity包含自己的本地的成本/收益LruCache的成本/收益。

这是我的两个主要问题。两者都围绕着我的应用程序非常大的事实,这意味着有很多屏幕显示这些图像。此外,我的应用程序具有流行的侧边菜单导航方式。正因为如此,我可以打开菜单,点击Activity B,打开菜单,点击Activity A,打开菜单......等等,并Activity无限期地创建一个 ABABABABABABAB 堆栈。

全球的

Activitys with ImageViews using Bitmaps from a global不会LruCache包含对这些的引用Bitmaps吗?假设用户Activity通过单击 some离开此位置Button。那Activity现在在Activity堆栈上,并且仍然保存对那些Bitmaps. 如果LruCache弹出一个Bitmap关闭,当堆栈中的某个in持有对它的引用Bitmap时,它真的可以被回收吗?ImageViewActivity

我之前创建了自己的自定义缓存。如果我调用recycle()a Bitmap,然后用户点击后退按钮返回到Activity堆栈中包含对 that 的ImageView集合的某个位置Bitmap,则应用程序将崩溃。这就是为什么我相信堆栈上的ImageViews 上Activity的 s 仍然持有对Bitmaps 的引用。

当地的

正如我之前提到的。我的应用程序非常大,侧边菜单样式的导航允许用户创建相当大的Activity堆栈。这会产生很多LruCaches。而且,由于您必须在LruCache初始化时声明它的大小,因此似乎没有任何选择大小的好方法。

想法?建议?

此时我想我必须做全局,但我不知道如何解决Activity堆栈引用问题。我无法想象这不是许多应用程序都没有遇到的问题。我不知道为什么我没有找到有关它的信息。