Android的三级缓存,其中主要的就是内存缓存和硬盘缓存,分别是LruCache和DisLruCache。
LruCache是Android 3.1所提供的一个缓存类,所以在Android中可以直接使用LruCache实现内存缓存。而DisLruCache目前在Android 还不是Android SDK的一部分,但Android官方文档推荐使用该算法来实现硬盘缓存。
简单使用
var listJob = ArrayList<Job>()
KotlinCacheUtil.INSTANCE.init(application)
val imageJob = KotlinCacheUtil.INSTANCE.setImageBitmap(
"https://img-my.csdn.net/uploads/201309/01/1378037235_7476.jpg",
imageView,
R.drawable.ic_launcher
)
listJob.add(imageJob)
取消协程防止内存泄漏
override fun onDestroy() {
super.onDestroy()
for (job in listJob){
job.cancel()
}
}
本文使用了Kotlin协程需要导入kotlinx-coroutines,网络请求框架okhttp
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1'
implementation 'com.squareup.okhttp3:okhttp:3.14.1'
implementation 'com.squareup.okio:okio:2.2.2'
混淆代码
##okhttp3混淆
-keep class okhttp3.** {*;}
-dontwarn okhttp3.**
##okio混淆
-keep class okio.** {*;}
-dontwarn okio.**
权限
6.0以上使用sd卡需要动态申请权限,自行百度
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
一、LruCache
不废话直接上工具类,初始化会在另一个管理缓存的工具类中使用,这里不需要操心
public class LruCacheUtil {
private static volatile LruCacheUtil instance;
private LruCacheUtil() {}
public static LruCacheUtil getInstance() {
if (instance == null) {
synchronized (LruCacheUtil.class) {
if (instance == null) {
instance = new LruCacheUtil();
}
}
}
return instance;
}
private LruCache<String, Bitmap> lruCache;
/**
* 初始化
*/
public void init() {
long maxMemory = Runtime.getRuntime().maxMemory();
int cacheSize = (int) (maxMemory / 8);
lruCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(@NotNull String key, @NotNull Bitmap value) {
return value.getByteCount();
}
};
}
/**
* 把Bitmap对象加入到缓存中
* @param imageUrl 图片url
* @param bitmap 加入缓存的图片
*/
public void addBitmapToMemory(String imageUrl, Bitmap bitmap) {
String key = Md5Util.getInstance().MD5(imageUrl);
if (getBitmapFromMemCache(key) == null) {
lruCache.put(key, bitmap);
}
}
/**
* 从缓存中得到Bitmap对象
* @param imageUrl 图片url
* @return Bitmap
*/
public Bitmap getBitmapFromMemCache(String imageUrl) {
String key = Md5Util.getInstance().MD5(imageUrl);
return lruCache.get(key);
}
/**
* 从缓存中删除指定的Bitmap
* @param imageUrl 图片url
*/
public void removeBitmapFromMemory(String imageUrl) {
String key = Md5Util.getInstance().MD5(imageUrl);
lruCache.remove(key);
}
/**
* 清除所有缓存
*/
public void evictAll(){
lruCache.evictAll();
}
}
二、DisLruCache
今年Kotlin语言从安卓一等公民升级为第一等公民,是时候重新学习一波Kotlin了,DisLruCache工具类使用了新特性“协程”,没有了解的小伙伴可以先了解一下,用过后都说好;Kotlin的IO