一行代码搞定三级缓存

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值