缓存模块怎么设计 android

2025-05-08 03:36:22
推荐回答(2个)
回答(1):

分三级缓存:

  1. 内存层:(手机内存)

    内存缓存相对于磁盘缓存而言,速度要来的快很多,但缺点容量较小且会被系统回收,这里的实现用到了LruCache。

    LruCache这个类是Android3.1版本中提供的,如果你是在更早的Android版本中开发,则需要导入android-support-v4的jar包。

  2. 磁盘层:(SD卡)

    相比内存缓存而言速度要来得慢很多,但容量很大,用到了DiskLruCache类。

    DiskLruCache是非Google官方编写,但获得官方认证的硬盘缓存类,该类没有限定在Android内,所以理论上java应用也可以使用DiskLreCache来缓存。

  3. 网络层:(移动网络,无线网络)

    这里的网络访问实现用到了开源框架Volley。

    开源框架Volley是2013年Google I/O大会发布的,Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。

回答(2):

内存缓存类(PanoMemCache)
这里使用Android提供的LruCache类,该类保存一个强引用来限制内容数量,每当Item被访问的时候,此Item就会移动到队列的头部。当cache已满的时候加入新的item时,在队列尾部的item会被回收。
[java] view plain copy print ?
public class PanoMemoryCache {

// LinkedHashMap初始容量
private static final int INITIAL_CAPACITY = 16;
// LinkedHashMap加载因子
private static final int LOAD_FACTOR = 0.75f;
// LinkedHashMap排序模式
private static final boolean ACCESS_ORDER = true;

// 软引用缓存
private static LinkedHashMap> mSoftCache;
// 硬引用缓存
private static LruCache mLruCache;

public PanoMemoryCache() {
// 获取单个进程可用内存的最大值
// 方式一:使用ActivityManager服务(计量单位为M)
/*int memClass = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();*/
// 方式二:使用Runtime类(计量单位为Byte)
final int memClass = (int) Runtime.getRuntime().maxMemory();
// 设置为可用内存的1/4(按Byte计算)
final int cacheSize = memClass / 4;
mLruCache = new LruCache(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap value) {
if(value != null) {
// 计算存储bitmap所占用的字节数
return value.getRowBytes() * value.getHeight();
} else {
return 0;
}
}

@Override
protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) {
if(oldValue != null) {
// 当硬引用缓存容量已满时,会使用LRU算法将最近没有被使用的图片转入软引用缓存
mSoftCache.put(key, new SoftReference(oldValue));
}
}
};