android磁盘缓存与内存缓存

Posted

技术标签:

【中文标题】android磁盘缓存与内存缓存【英文标题】:android disk cache vs memory cache 【发布时间】:2016-06-12 09:23:48 【问题描述】:

我不完全明白何时应该使用内存缓存 (LruCache) 以及何时选择磁盘缓存。还是我应该同时使用它们? 我看了here

【问题讨论】:

内存缓存是自动的,取决于您使用的类。一些创建的布局和字符串值也被存储用于翻译目的或变量字符串引用。所以你在说什么。选择使用什么? 同时使用。如果你只使用 Lru,你会减慢设备的速度。如果您只使用磁盘,则会占用设备的存储空间 【参考方案1】:

内存缓存:-

更快地访问此缓存 此缓存会占用您的应用程序内存,因此请避免使用它来存储大量数据 一旦应用进入后台,内存缓存就会被破坏并被系统杀死以节省资源

磁盘缓存:-

比内存缓存慢 将其用于大型缓存数据 即使在应用进入后台后数据仍然存在

【讨论】:

【参考方案2】:

LruCache

简单地说,LruCahce 有点像HashMap。它将在运行时存储您的键值对,直到

    应用程序在后台被杀死 用户通过单击返回按钮退出应用程序 用户旋转设备

看下面的代码sn-p。一旦上述操作之一发生,lruCahcerandomString 都将从内存缓存中删除

public class Activity extends AppCompatActivity 

    LruCache<String, Bitmap> lruCache = new LruCache<>(1 * 1024 * 1024); // That means 1Mb memory will be allocated to this LruCahce object
    String ranDomString;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_store);

        lruCache.put("first_bitmap_url", firstBitmap);
        lruCache.put("second_bitmap_url", secondBitmap);

        ranDomString = "Random string";
    

DiskLruCahce

相反,DiskLruCache 将在上述所有操作(被杀死/被返回按钮/屏幕旋转退出)中幸存下来,并且下次 Activity 启动时,您可以从磁盘读取这些数据。在这种情况下,我们可以在下次启动应用程序时获取具有给定键的位图。下面的示例是来自 android 源代码的 sn-p:

public class Activity extends AppCompatActivity 

    DiskLruCache disklruCache = new DiskLruCache.open(this.getCacheDir(), 1 * 1024 * 1024); // That means 1Mb memory will be allocated to this DiskLruCahce object

    String ranDomString;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_store);

        disklruCache.put("first_bitmap_url", firstBitmap);
        disklruCache.put("second_bitmap_url", secondBitmap);

    

【讨论】:

以上是关于android磁盘缓存与内存缓存的主要内容,如果未能解决你的问题,请参考以下文章

Chrome 内存缓存与磁盘缓存

关于Android中的三级缓存

将 LRU 图像缓存与 HTTPResponseCache 结合用于磁盘和内存缓存

关于Android中的三级缓存

组合缓存方法 - 基于内存缓存/磁盘

高速缓存与缓冲区