glide获取本地缓存文件_Glide 缓存原理实现

本文探讨了Android开发中Glide的缓存原理,包括活动缓存、内存缓存、Bitmap复用池、磁盘缓存和生命周期管理。详细解释了各环节如何运作,如Lru算法在内存缓存中的应用,以及如何通过DiskLruCache实现磁盘缓存。同时,还提到了网络和SD卡加载的实现,并提供了源码查看的途径。
摘要由CSDN通过智能技术生成

Glide 缓存原理实现

专注于Android开发,分享经验总结,欢迎加入

b85674f46222118a541738e81e2c0799.png

Glide使用方式如下:

    Glide.with(MainActivity.this)
                        .load(path)
                        .into(iv);

Glide缓存分为:活动缓存、内存缓存、Bitmap复用池、磁盘缓存、加载外置(网络或者SD卡)、绑定生命周期

具体的流程如下

5e9bbb8ed5018f88cd368aeec0b6b646.png

* 资源封装

Key -- 对Value的唯一性进行描述

Value -- 对Bitmap的封装

* 活动缓存

// 用容器存储

private HashMap<String, WeakReference<Value>> map = new HashMap<>();

        // 继承WeakReference(目的:为了监听这个弱引用 是否被回收了)
        public class CustomWeakReference extends WeakReference {
            public String key;

            public CustomWeakReference(Object referent, ReferenceQueue queue, String key) {
                super(referent, queue);
                this.key = key;
            }
        }

         /**
         * 目的:为了监听这个弱引用 是否被回收了
         * queue.remove() 会阻塞线程
         *
         * @return
         */
        public ReferenceQueue<Value> getQueue() {
            if (queue == null) {
                queue = new ReferenceQueue<>();
                // 监听这个弱引用 是否被回收了
                thread = new Thread() {
                    @Override
                    public void run() {
                        while (!isCloseThread) {
                            if (!isShoudonRemove) {
                                try {
                                    // 阻塞式的方法,被动调用queue.remove(),进行回收
                                    Reference<? extends Value> remove = queue.remove();
                                    CustomWeakReference customWeakReference = (CustomWeakReference) remove;
                                    if (map != null && !map.isEmpty()) {
                                        // 移除容器 !isShoudonRemove:为了区分手动移除 和 被动移除
                                        map.remove(customWeakReference.key);
                                    }
                                    Log.d(TAG, "getQueue remove ");
                                } catch (InterruptedException e) {
                                    Log.d(TAG, "getQueue InterruptedException e :" + e.getMessage());
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值