android - 缓存位图 - 检查当前 VM 预算

标签 android caching architecture bitmap out-of-memory

我想知道是否有人对旨在缓存尽可能多的动态发现的图像的架构有任何经验。

在我的情况下,我为从 ListView 单击的每个项目请求一个位图。这些位图是通过网络接收的(就处理或网络 I/O 而言,这不是一个便宜的操作)。用户可能会从列表中加载一些项目,并在它们之间切换。我缓存了这些图像,以便后续对项目的请求会导致位图的即时加载:

private Bitmap bitmap = null;
public Bitmap getBitmap(int id) {
    if(bitmap == null) bitmap = expensiveNetworkOperationToGetBitmap(id);
    return bitmap;
}

(请忽略线程阻塞问题)

但是,用户很可能会浏览很多项。每一个都慢慢占用一段内存,最终超出预算并导致应用程序崩溃。

这让我提出这个问题:是否可以动态检测缓存何时达到限制?如果是这样,应该可以在添加新图像时开始销毁旧图像。请参阅下面的示例代码:

private HashMap<Integer, Bitmap> bitmaps = new HashMap<Integer, Bitmap>();
public Bitmap getBitmap(int id) {
    Bitmap bitmap;
    if(!bitmaps.contains(id)) {
        if(// Bitmap budget close to being exeeded?) {
            bitmaps.keyValues().get(0).recycle();
            bitmaps.remove(bitmaps.keyValues().get(0));
        }
        bitmap = expensiveNetworkOperationToGetBitmap(id);
        bitmaps.put(id, bitmap);
    else {
        bitmap = bitmaps.get(id);
    }
    return bitmap;
}

再一次,请忽略从 HashMap 中弹出第一个 Bitmap 的低效率问题。

我希望有人对注释掉的部分提出建议。如果有比这更好的解决方案,很高兴听到。

最佳答案

如果您希望能够让您的缓存增长基本上不受 VM 堆限制的限制,您可以对位图使用类似 SoftReference 的集合。

http://developer.android.com/reference/java/lang/ref/SoftReference.html

您可能还希望在您的 Activity 中实现 onLowMemory() 以便与系统配合良好,因为您希望拥有如此大的缓存。

关于android - 缓存位图 - 检查当前 VM 预算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9617454/

相关文章:

c# - 在 DDD 中拥有独立的领域模型和持久性模型

php - php 网站的架构帮助

java - 创建空白 Activity 不会生成 R.java

delphi - 如何从Windows获取用于存储缓存缩略图的永久目录?

java - 尝试在空对象引用上调用虚拟方法 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)'

c# - 在 asp.net 中缓存用户数据的最佳做法是什么

iOS 应用 : When should I clear my cache data?(使用 Realm)

database - Django:数据库设计的最佳实践

android - 此错误的原因是什么以及如何解决?

android - 如何将上传文件的名称更改为 firebase 存储?