安卓Glide那些事情面试,一篇全部搞定

news2024/11/19 4:46:29

安卓Glide那些事情面试,一篇全部搞定

  • 一.Glide有几级缓存???
  • 二.Gllide源码分析
  • 三.内存缓存和磁盘缓存LruCache算法
  • 四.Gllide基本使用
  • 五.Gllide高级使用:配置
    • 1.配置内存和磁盘缓存大小
    • 2.配置okhttp
    • 3.配置https认证
    • 4.使用

一.Glide有几级缓存???

Gllide的四级缓存流程图:
在这里插入图片描述
通过上面这个流程图,我们可以知道Glide的缓存可以分为四级,第一个是ActiveResources,第二个是MemoryCache内存缓存,第三个是DiskCache磁盘缓存,第四个是网络获取。ActiveResources使用弱引用,内存缓存和磁盘缓存使用LruCache近期最少使用原则

Gllide的源码分析流程:
在这里插入图片描述
我们主要讨论这三个缓存,不讨论网络缓存
范围:
1、活动缓存:在某个Activity范围,页面退出该缓存就不存在
2、内存缓存:某个App范围,应用完全退出就不存在
3、磁盘缓存:整个系统,只要不删除数据,就一直存在

作用:
1、活动缓存:分担内存缓存的负担,
2、内存缓存:加快数据读取
3、磁盘缓存:进行永久性保持
活动缓存的说明
1、活动缓存并不是我们熟悉的内存缓存,是Glide自己定义的一种缓存策略。
2、本质上就是HasMap,用了一次就缓存,以后需要就直接拿,不需要就清除这个缓存。
3、该策略的存在也是为了及时释放内存,不需要等等整个应用退出再释放内存,减轻应用内存负担。
4、活动缓存比内存缓存小,如果活动缓存满了,会自动写到内存缓存。
5、系统会对内存缓存进行自动管理,只要不是快速存放大内存文件,并且不一直占有内存对象,都不会内存溢出。
内存缓存的说明
内存缓存是系统自身会管理的,但是可以继承LruCache,做进一步管理
磁盘缓存的说明
1、磁盘缓存本质是本地文件缓存,但是通过普通的文件写入读取效率不高。
2、Glide中使用了DiskLruCache框架进行数据保存和读取。
3、效率高的主要原因是:磁盘缓存对图片文件进行了加密和压缩处理。
总结
1、优先从活动缓存获取
2、活动缓存没有就再内存缓存中寻找
3、内存缓存没有,就去磁盘缓存读取
4、磁盘缓存没有就去网络获取本地文件读取

二.Gllide源码分析

https://blog.csdn.net/nufuli123/article/details/123806389

三.内存缓存和磁盘缓存LruCache算法

内存缓存:LruCache算法中LinkedHashMap
磁盘缓存: journal日志清单文件

磁盘读写也是用的LRU算法。但是这个和内存的LRU算法有一点小区别。为什么呢?因为内存缓存是我们运行的时候,程序加载内存里面的资源,可以直接通过一个LinkedHashMap去实现。但是磁盘不同,我总不可能吧所有磁盘的资源读出来然后加载在内存里面吧,这样的话,肯定会引发oom了。那么Glide是怎么做磁盘的LRU的呢?

Glide 是使用一个日志清单文件来保存这种顺序,DiskLruCache 在 APP 第一次安装时会在缓存文件夹下创建一个 journal 日志文件来记录图片的添加、删除、读取等等操作,后面每次打开 APP 都会读取这个文件,把其中记录下来的缓存文件名读取到 LinkedHashMap 中,后面每次对图片的操作不仅是操作这个 LinkedHashMap 还要记录在 journal 文件中. journal 文件内容如下图:

data/data/应用包名/cache/。。。。。
在这里插入图片描述
journal文件:在这里插入图片描述

四.Gllide基本使用

Glide.with(this).load(url).into(imageView);//默认是开启内存缓存和磁盘缓存的。
1.内存缓存:

Glide.with(this)
     .load(url)
     .skipMemoryCache(true)//关闭内存缓存
     .into(imageView);

2.磁盘缓存:

Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)//磁盘缓存
     .into(imageView);

一个 diskCacheStrategy( ) 方法就可以调整他的硬盘缓存策略。其中可以传入的参数有四种

DiskCacheStrategy.ALL :     //表示既缓存原始图片,也缓存转换过后的图片。
DiskCacheStrategy.NONE:     //表示不缓存任何内容。
DiskCacheStrategy.RESOURCE: //表示只缓存原始图片。
DiskCacheStrategy.RESULT:   //(已过期,新api4.11修改为后面两个)表示只缓存转换过后的图片(默认选项)。
DiskCacheStrategy.DATA:     //表示只缓存转换过后的图片。
DiskCacheStrategy.AUTOMATIC  //表示智能判断选择模式(默认选项)。

3.清理缓存:

Glide.get(GlideActivity.this).clearMemory();//清除内存缓存
new Thread(new Runnable() {
                        @Override
                        public void run() {
                            Glide.get(GlideActivity.this).clearDiskCache();//清除SD卡缓存
                        }
                    }).start();


五.Gllide高级使用:配置

依赖:

  implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
    // Glide集成OkHttp时需要使用的库,库已经将需要适配Okhhtp的大部分代码封装,注意如果之前已经使用了okhttp依赖注释掉
    implementation "com.github.bumptech.glide:okhttp3-integration:4.13.0"
    implementation 'com.github.bumptech.glide:glide:4.13.0'
    kapt 'com.github.bumptech.glide:compiler:4.13.0'//Glide注解处理器的依赖

权限:

<uses-permission android:name="android.permission.INTERNET"/>
<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"/>

1.配置内存和磁盘缓存大小

@GlideModule
class MyGlideModule: AppGlideModule() {
    override fun applyOptions(context: Context, builder: GlideBuilder) {
       
        var memorySizeCalculator = MemorySizeCalculator.Builder(context).build()
        //设置内存缓存大小
        builder.setMemoryCache(LruResourceCache(memorySizeCalculator.memoryCacheSize.toLong()))
        //设置磁盘缓存目录和大小,默认目录:"image_manager_disk_cache"  默认大小:250 * 1024 * 1024
        builder.setDiskCache(InternalCacheDiskCacheFactory(context,"image",500 * 1024 * 1024))
    }
}

2.配置okhttp

glide默认使用HttpUrlConnection请求网络图片

@GlideModule
class OkHttpLibraryGlideModule: LibraryGlideModule() {
    override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
        var client = OkHttpClient.Builder()
            .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
            .build()
        registry.replace(GlideUrl::class.java,InputStream::class.java,OkHttpUrlLoader.Factory(client))

    }
}

3.配置https认证

使用上面的代码去加载一些网络上的https图片一般是没有问题的,没问题是因为网络上的https使用的证书一般是权威机构颁发的证书,而这些权威机构的根证书在手机出厂时就已经预装在手机里面了,所以我们加载https图片时会自动完成认证,但是突然有一天,我们公司的网络请求也改成了Https了,用的是自定义证书,并不是权威机构颁发的,所以这个时候加载公司的https的图片时就加载失败了,异常如下:

Glide: Load failed for https://192.168.1.250:8080/cat.jpg with size [1080x162]
class com.bumptech.glide.load.engine.GlideException: Failed to load resource
There was 1 cause:
javax.net.ssl.SSLHandshakeException(java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.)

看到CertPathValidatorException(证书路径验证器异常)不用我多说应该也知道是什么原理导致的了。

@GlideModule
class OkHttpLibraryGlideModule: LibraryGlideModule() {
    override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
        var client = OkHttpClient.Builder()
            .sslSocketFactory(sSLSocketFactory, trustManager)//https认证
            .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
            .build()
        registry.replace(GlideUrl::class.java,InputStream::class.java,OkHttpUrlLoader.Factory(client))
    }

    /** 获取一个SSLSocketFactory */
    val sSLSocketFactory: SSLSocketFactory
        get() = try {
            val sslContext = SSLContext.getInstance("SSL")
            sslContext.init(null, arrayOf(trustManager), SecureRandom())
            sslContext.socketFactory
        } catch (e: Exception) {
            throw RuntimeException(e)
        }

    /** 获取一个忽略证书的X509TrustManager */
    val trustManager: X509TrustManager
        get() = object : X509TrustManager {
            override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) { }
            override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) { }
            override fun getAcceptedIssuers(): Array<X509Certificate> { return arrayOf() }
        }
}

4.使用

最后还有一步,第2步创建的类中使用了注解,Glide会自动生成一个GlideApp的类,这个类就是使用了我们配置的OkHttp的,所以在下载图片时,我们要使用GlideApp来代替之前的Glide类,如下:

GlideApp.with(this)
                .load("https://192.168.1.250:8080/cat.jpg")
                .centerCrop()
                .placeholder(R.mipmap.ic_launcher)
                .into(imageView) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/492330.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

冲浪杂记——

华为od是指什么&#xff1f; 华为OD&#xff08;Open Developer Platform&#xff09;是华为面向全球开发者推出的开放平台&#xff0c;旨在为开发者提供丰富的技术资源和开发工具&#xff0c;支持开发者快速构建基于华为技术的应用程序、解决方案和服务。华为OD平台为开发者提…

微软新Bing全面开放BingChat,无需排队,直接用

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 好消息&#xff0c;所有人都能上手微软Bing了!微软表示&#xff0c;为了感谢大量用户的使用与反馈&#xff0c;从今天起新 Bing 不再有候补名单&#xff0c;只要使用微软账户登录 Bing&#xff0c;…

函数(1)

文章目录 目录1. 函数是什么2. 库函数3. 自定义函数4. 函数的参数4.1 实际参数&#xff08;实参&#xff09;4.2 形式参数&#xff08;形参&#xff09; 5. 函数的调用5.1 传值调用5.2 传址调用5.3 练习 附&#xff1a; 目录 函数是什么库函数自定义函数函数的参数函数的调用函…

实现北大官网首页的动态图标

逛网站的时候&#xff0c;看见有人在问如何实现北大官网的动态图标&#xff0c;因为做过类似的东西&#xff0c;所以想把这个方法整理下来。 点上去会有一个小动画的那种。 如何实现该图标的动态效果 一句话&#xff1a;用svg实现图标&#xff0c;利用stroke-dasharray和str…

Rust - 切片Slice

Slice类型 Slice数据类型没有所有权&#xff0c;slice允许我们引用集合中一段连续的元素序列而不用引用整个集合。字符串slice(string slice) 是String中 一部分值的引用。如下述代码示例&#xff0c;不是对整个String的引用而是对部分String的引用&#xff1a; fn main() {l…

虹科方案 | HK-Edgility面向未来的安全 SD-WAN

通过上期的文章&#xff0c;我们了解到虹科HK-Edgility软件系统《随时随地保护您的远程工作解决方案》的解决方案。这篇文章&#xff0c;我们将带您了解虹科系统在SD-WAN的方案简介。 一、时代背景 过去&#xff0c;企业使用专线或MPLS解决方案将其站点和办公室连接到企业数据中…

数据结构——链表(python版)

一、链表简介 链表是一种在存储单元上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过链表中的指针链接次序实现。链表是由一系列的结点组成&#xff0c;结点可以在运行时动态生成。每个结点包含两部分&#xff1a;数据域与指针域。数据域存储数据元素&#xff0c;指针域…

封装server类,创建多个server服务

&#xff08;一&#xff09;封装server类 MessageHeader.hpp #ifndef _MessageHeader_hpp_ #define _MessageHeader_hpp_ #endif #pragma once enum CMD {CMD_LOGIN,CMD_LOGIN_RESULT,CMD_LOGOUT,CMD_LOGOUT_RESULT,CMD_NEW_USER_JOIN,CMD_ERROR };struct DataHeader {short …

安装RedisBloom插件

前言 安装RedisBloom模块会遇到很多坑&#xff0c;希望你不要和我一样踩的这么全&#x1f60f;。 下载RedisBloom插件 布隆过滤器插件下载地址 github.com/RedisBloom/RedisBloom/releases 在对应的Linux机器下载 wget https://github.com/RedisBloom/RedisBloom/archive/…

一文搞懂,这几种 API 的不同应用场景

API&#xff0c;即应用程序编程接口&#xff0c;为不同应用程序之间的数据和功能交互提供标准化的方法。在现代软件架构中&#xff0c;各种类型的 API 成为了构建了复杂应用系统的关键部分。而随着技术的发展&#xff0c;越来越多的 API 类型也出现了&#xff0c;例如&#xff…

Flash Jetson Linux 刷写系统报错处理

目录 报错一&#xff1a;No such file or directory: dtc解决方案 报错二&#xff1a;ERROR sshpass not found 等其他执行刷写的依赖包解决方案 结论 报错一&#xff1a;No such file or directory: ‘dtc’ 在使用 SDK Manager 刷写Jetson Linux 时&#xff0c;在完成了 Cre…

DD驱动鼠标键盘(驱动级别机器人使用鼠标键盘)

官网下载 DD虚拟键盘虚拟鼠标 github下载 GitHub - ddxoft/master 点击下载后&#xff0c;将驱动包下&#xff0c;这里以win7为例 setup运行安装 安装成功后 可以打开电脑管理&#xff0c;可以看见DD虚拟鼠标和键盘 这里以JAVA接入为例 使用管理员权限启动eclipse &#…

python安装报错error: pybind11 2.10+ requires MSVC 2017 or newer

python安装报错error: pybind11 2.10 requires MSVC 2017 or newer文章来源&#xff1a;https://www.cnblogs.com/viete/p/16909793.html 下载Build Tools for Visual Studio 2017 &#xff0c;打开后选单个组件&#xff0c;再选VC2017最新版本。 https://download.visualstu…

第7章:字符串函数

字符串函数 1.字符串函数 2.举例 select ASCII(A),CHAR_LENGTH(hello),CHAR_LENGTH(我们), LENGTH(hello),LENGTH(我们) from dual;3.举例 ①select CONCAT(emp.last_name,-worked for-,mgr.last_name) "details" from employees emp left join employees mgr on em…

61.网页设计规则#7_元素之间的空白

为什么需要空白&#xff1f; 适度的空白使设计看起来整洁、现代和精致。空白传达不同片段信息之间的关系。空白意味着布局元素之间存在看不见的关系。 如何去使用空白&#xff1f; 各部分之间使用大量的空白&#xff1b; 元素组之间使用大量的空白。 在各个元素之间使用空白…

优化了成本和安装难度后,UWB信标能否取代蓝牙信标?

1 我们做安U3号是要解决什么问题&#xff1f; &#xff08;1&#xff09;信标式设计&#xff0c;解决传统UWB基站安装过程繁琐复杂的问题 传统UWB基站在安装过程中遇上的难题&#xff1a; l 安装位置选取问题&#xff1a;UWB基站的准确度与其安装位置有很大关系&#xff0c;…

qt实现国际化方法与步骤

1. 在程序中所有需要翻译的字符串都用tr封装&#xff0c;如tr("hello"); 2. 在项目文件(.pro)中增加语言翻译文件选项&#xff0c; 如 TRANSLATIONS trans_cn.ts trans_en.ts 3. 在Qt Creator的菜单栏中依次选择“工具”-> ”外部“->“语言家”->&q…

Windows下安装MySQL数据库(从完全卸载到安装使用图文详细步骤,附安装包)

目录 第一章&#xff1a;如何完全卸载干净mysql教程&#xff08;三个步骤完全卸载&#xff09;1&#xff09;步骤一&#xff1a;卸载程序2&#xff09;步骤二&#xff1a;删除文件3&#xff09;步骤三&#xff1a;删除注册表信息 第二章&#xff1a;下载软件两种方式1&#xff…

FT2000+ qemu kvm openEuer crash 分析 频繁设置CPU online及cgroup导致进程卡死、不调度故障

测试用例1 openEuler 20.03 默认内核 https://hknaruto.blog.csdn.net/article/details/130498823 内核版本信息 突然就坚挺起来&#xff0c;长时间稳定运行 。。。 测试用例2&#xff1a;CentOS8 (16C16G) 十几分钟后&#xff0c;终端已卡死 &#xff0c;两个终端均无响应&a…

月报总结|Moonbeam 4月份大事一览

本月&#xff0c;Moonbeam生态扶持进入下一里程碑&#xff01;探索更多优质的早期Web3项目&#xff0c;Moonbeam Accelerator Program已公布进入最终加速孵化阶段的10家初创公司&#xff0c;这些幸运项目将在未来3个月接受顶级孵化公司和专业投资机构的培训&#xff0c;于下半年…