android LruCache的使用 (本地缓存+内存缓存)

本文介绍了一种自定义LRU缓存实现方法,通过继承Android的LruCache类并覆盖其方法,实现图片的内存及本地缓存管理。文章详细讲解了如何在内存缓存不足时将数据保存至本地,并设置了本地缓存的最大限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.example.redbaby.utils;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;


import android.annotation.TargetApi;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Environment;
import android.os.StatFs;
import android.util.Log;
import android.util.LruCache;


/**
 * 实现系统的LRCCACHE的子类 用于本地缓存图片 当内存中的缓存超过阀值就会去删除连标的最前边那个(访问最少的) 而且会调用
 * entryRemoved()方法 这个方法实际上什么都没有做 这里我们来实现它 将删除的图片保存在本地
 * 
 * create方法呢 是在调用lrucache的get方法时如果内存中没有该key对应的value 那么就会调用create方法
 * create方法也是什么没做 这里我们来实现它从文件系统取出数据
 * 
 * @author s0ng
 * 
 * @param <K>
 * @param <V>
 */
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
public class MyLruCache extends LruCache<String, Bitmap> {


private long local_Size;
private File file;
private long freeSize;
private static final long NOT_LOCAL_CACHE_SIZE = 50 * 1024 * 1024;


public MyLruCache(int maxSize, long local_Size, String file_path) {
super(maxSize);
this.local_Size = local_Size;
file = new File(file_path);
if (file.exists()) {
if (!file.isDirectory()) {
throw new IllegalArgumentException("maxSize <= 0");


}
} else {
file.mkdirs();
}
freeSize = freeSpaceOnSd();


}


@Override
protected Bitmap create(String key) {
// 这里从我们的文件系统中找到


key = key.replace("/", "杠");
key = key.replace(":", "冒");
String path = file.getAbsolutePath() + "/" + key;
return BitmapFactory.decodeFile(path);


}


/**
 * 这里讲value添加到我们的 文件系统 但是必须保证 如果文件的内容超出 缓存指定大小
 */
@Override
protected void entryRemoved(boolean evicted, String key, Bitmap oldValue,
Bitmap newValue) {


/**
 * 如果开启本应用的时候内存小于50M 我们就不要本地缓存了
 * 
 */
if (NOT_LOCAL_CACHE_SIZE > freeSize) {
return;
}


key = key.replace("/", "杠");
key = key.replace(":", "冒");

File bm = (new File(file, key));
if (bm.exists()) {
return;
}


try {
bm.createNewFile();
OutputStream outStream = new FileOutputStream(bm);
oldValue.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.flush();
outStream.close();
} catch (FileNotFoundException e) {
Log.w("ImageFileCache", "FileNotFoundException");
} catch (IOException e) {
e.printStackTrace();
Log.w("ImageFileCache", "IOException");
}


}


private int freeSpaceOnSd() {
StatFs stat = new StatFs(Environment.getExternalStorageDirectory()
.getPath());
double sdFree = ((double) stat.getAvailableBlocks() * (double) stat
.getBlockSize());
return (int) sdFree;
}


@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}


}



就是这么简单 不用双缓存  另外 还以一给缓存本地文件设置个大小上线  并且本人还是很有良知的 剩余sd卡内存小于50M的时候我们就不往本地存储卡写数据了 

图的遍历算法可以分为两种:深度优先遍历(DFS)和广度优先遍历(BFS)。而七巧板则可以看作是一个由不同形状的七个木块组成的图形,可以用图来表示。因此,我们可以将图的遍历算法应用到七巧板的涂色上。 假设我们已经将七个木块用图表示出来,每个木块为图中的一个节点,如果两个木块之间可以相互组合,则它们之间就有一条边。现在我们需要对这个图进行涂色,使得相邻的木块颜色不同。 深度优先遍历算法可以通过递归实现。从一个节点出发,先标记该节点已经被访问过,然后遍历与该节点相邻的所有节点,对于每一个未被访问过的相邻节点,都以该节点为起点递归调用深度优先遍历算法,直到所有节点都被访问过。在七巧板涂色的问题中,我们可以从任意一个木块出发,以深度优先遍历的方式遍历整个图,每次访问一个节点时,将其涂上与相邻节点不同的颜色。 广度优先遍历算法可以通过队列实现。从一个节点出发,先将该节点加入队列中,然后遍历队列中的所有节点,对于每一个已经访问过的节点,将其相邻的所有未被访问过的节点加入队列中,并标记它们已经被访问过。在七巧板涂色的问题中,我们可以从任意一个木块出发,以广度优先遍历的方式遍历整个图,每次访问一个节点时,将其涂上与相邻节点不同的颜色。 需要注意的是,在七巧板涂色的问题中,每个节点有多个相邻节点,因此需要考虑如何判断相邻节点的颜色。可以在遍历过程中记录每个节点已经被涂上的颜色,然后在遍历到一个相邻节点时,判断该节点已经被涂上的颜色是否与相邻节点相同。如果相同,则需要继续遍历,直到找到一个与其它相邻节点颜色不同的节点为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TangGeeA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值