Android番外篇 LruCache缓存机制
Posted 彭老希
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android番外篇 LruCache缓存机制相关的知识,希望对你有一定的参考价值。
一、引言
android提供的使用了(Least Recently Used)近期最少使用算法的缓存类,内部基于LinkedHashMap实现。
- 构造时需要确定
Cache
的最大内存
//获取程序最大可用内存
int max = (int)Runtime.getRuntime().maxMemory();
//取可用内存的四分之一做缓存
int size = max/4;
sizeOf()
方法
在添加value到Cache时会被调用,需要返回添加进数据的字节大小
- 在 put(key,value)添加时先通过get(key)判断是否已经有key对应的value存在
二、例子展示
(1)例子一
import android.util.LruCache;
/**
* @author : Dumplings
* @version : v1.0.0
* @ClassName : MyLruCache.java
* @Function : 缓存算法
* @Description : 内存缓存图片Bitmap
* @Idea :
* {@link }
* @Encourage :And the more we try to understand one another, the more exceptional each of us will be.
* 我们越是努力理解他人,自身也越发变得优秀。
* @date : 2021/6/3
*/
public class MyLruCache extends LruCache<String, Bitmap> {
private static MyLruCache myLruCache;
private MyLruCache(int maxSize) {
super(maxSize);
}
public static MyLruCache getMyLruCache() {
if (myLruCache == null) {
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int maxSize = maxMemory / 4;
myLruCache = new MyLruCache(maxSize);
}
return myLruCache;
}
//每次存入bitmap时调用,返回存入的数据大小
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}
//添加
public void add(String key, Bitmap bitmap) {
if (get(key) == null) {
put(key, bitmap);
}
}
//获取
public Bitmap getBitmap(String key) {
return get(key);
}
}
(2)例子二
import android.util.LruCache;
/**
* @author : Dumplings
* @version : v1.0.0
* @ClassName : MyLruCache.java
* @Function : 缓存算法
* @Description :
* @Idea :
* {@link }
* @Encourage :And the more we try to understand one another, the more exceptional each of us will be.
* 我们越是努力理解他人,自身也越发变得优秀。
* @date : 2021/6/3
*/
public class MyLruCache<T> extends LruCache<String, T> {
private static volatile MyLruCache instance = null;
private MyLruCache(int maxSize) {
super(maxSize);
}
public static <T> MyLruCache getInstance() {
if (instance == null) {
synchronized (MyLruCache.class) {
if (instance == null) {
instance = new MyLruCache<T>(1024 * 1024 * 20);
}
}
}
return instance;
}
}
调用:
MyLruCache<Drawable> myLruCache = MyLruCache.getInstance();
Drawable thatDrawable = myLruCache.get("key");
if (thatDrawable == null) {
//data.getAppIcon() 图片路径 or 图片资源 ...
thatDrawable = data.getAppIcon();
myLruCache.put("key", thatDrawable);
}
//图片控件imageView(你自己的图片控件变量名称)显示
imageView.setBackground(thatDrawable);
以上是关于Android番外篇 LruCache缓存机制的主要内容,如果未能解决你的问题,请参考以下文章
Android番外篇 Glide获取图片PathBitmap用法详解
Android番外篇 ViewPager.setOffscreenPageLimit()