Android App开发之利用Glide实现图片的三级缓存Cache讲解及实战(附源码 超详细必看 简单易懂)

news/2024/4/25 8:57:34/文章来源:https://blog.csdn.net/jiebaoshayebuhui/article/details/127872444

需要图片集和源码请点赞关注收藏后评论区留言~~~

一、利用Glide实现图片的三级缓存

图片加载框架之所以高效,是因为它不但封装了访问网络的步骤,而且引入了三级缓存的机制。具体来说,是先到内存中查找图片,找到了就直接显示内存图片,没找到就去磁盘中查找图片,在磁盘中找到就直接显示磁盘图片,最后没找到的话再去请求网络。如此便形成了内存-磁盘-网络的三级缓存。(学过计算机组成原理或操作系统的同学应该对这个思想比较熟悉~~~)

对于Glide而言,默认已经开启了三级缓存机制 ,当然也可以根据实际情况另行调整。

 请求建造器RequestBuilder有以下常用 方法

1:placeholder 设置加载开始的占位图

2:error  设置发生错误的提示图

3:override  设置图片的尺寸

4:diskCacheStrategy  设置指定的缓存策略

5:skipMemoryCache  设置是否跳过内存缓存

6:disallowHardwareConfig  关闭硬件加速

7:fitCenter 保持图片的宽高比例并居中显示

8:centerCrop  保持图片的宽高比例 使它充满视图

9:circleCrop 展示圆形剪裁后的图片

另外Glide允许播放加载过程的渐变动画,让图片从迷雾中逐渐变得清晰 有助于提高用户体验

效果如下

点击不同的按钮以及下拉框选项可呈现不同的效果以及缓存策略

 

 

 

 

 代码如下

Java类

package com.example.chapter14;import android.annotation.SuppressLint;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.Spinner;import androidx.appcompat.app.AppCompatActivity;import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestBuilder;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.Target;@SuppressLint("CheckResult")
public class GlideCacheActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {private ImageView iv_network;private String mImageUrl = "http://b68.photo.store.qq.com/psu?/0664e98e-f40a-4899-b6d6-4f4f1d94ef3c/4qBaAk.83Z9Zw9XIZUwtV**iFrAWIquow4FP0aIIQSc!/b/YWWPjCjyCgAAYra8lShRCwAA";private CheckBox ck_seize; // 声明一个复选框对象。是否启用占位图private CheckBox ck_error; // 声明一个复选框对象。是否启用出错图private CheckBox ck_original; // 声明一个复选框对象。是否加载原图片private CheckBox ck_transition; // 声明一个复选框对象。是否呈现渐变动画private int mCacheStrategy; // 缓存策略的类型@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_glide_cache);iv_network = findViewById(R.id.iv_network);ck_seize = findViewById(R.id.ck_seize);ck_error = findViewById(R.id.ck_error);ck_original = findViewById(R.id.ck_original);ck_transition = findViewById(R.id.ck_transition);ck_seize.setOnCheckedChangeListener(this);ck_error.setOnCheckedChangeListener(this);ck_original.setOnCheckedChangeListener(this);ck_transition.setOnCheckedChangeListener(this);initStrategySpinner(); // 初始化缓存策略的下拉框}// 初始化缓存策略的下拉框private void initStrategySpinner() {ArrayAdapter<String> modeAdapter = new ArrayAdapter<String>(this,R.layout.item_select, strategyArray);Spinner sp_cache_strategy = findViewById(R.id.sp_cache_strategy);sp_cache_strategy.setPrompt("请选择缓存策略");sp_cache_strategy.setAdapter(modeAdapter);sp_cache_strategy.setSelection(0);sp_cache_strategy.setOnItemSelectedListener(new StrategySelectedListener());}private String[] strategyArray = {"自动选择缓存策略", "不缓存图片", "只缓存原始图片", "只缓存压缩后的图片", "同时缓存原图和压缩图片"};@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {showNetworkImage(); // 加载并显示网络图片}class StrategySelectedListener implements AdapterView.OnItemSelectedListener {public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {mCacheStrategy = arg2;showNetworkImage(); // 加载并显示网络图片}public void onNothingSelected(AdapterView<?> arg0) {}}// 加载并显示网络图片private void showNetworkImage() {// 构建一个加载网络图片的建造器RequestBuilder<Drawable> builder = Glide.with(this).load(mImageUrl);RequestOptions options = new RequestOptions(); // 创建Glide的请求选项
//        options.disallowHardwareConfig(); // 关闭硬件加速,防止过大尺寸的图片加载报错options.skipMemoryCache(true); // 是否跳过内存缓存(但不影响硬盘缓存)options.override(300, 200); // 设置图片的宽高if (ck_seize.isChecked()) { // 勾选了占位图options.placeholder(R.drawable.load_default); // 设置加载开始的占位图}if (ck_error.isChecked()) { // 勾选了出错图options.error(R.drawable.load_error); // 设置发生错误的提示图}if (ck_original.isChecked()) { // 勾选了原始图options.override(Target.SIZE_ORIGINAL); // 展示原始图片}if (ck_transition.isChecked()) { // 勾选了渐变动画builder.transition(DrawableTransitionOptions.withCrossFade(3000)); // 设置时长3秒的渐变动画}if (mCacheStrategy == 0) { // 自动选择缓存策略options.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC); // 设置指定的缓存策略} else if (mCacheStrategy == 1) { // 不缓存图片options.diskCacheStrategy(DiskCacheStrategy.NONE); // 设置指定的缓存策略} else if (mCacheStrategy == 2) { // 只缓存原始图片options.diskCacheStrategy(DiskCacheStrategy.DATA); // 设置指定的缓存策略} else if (mCacheStrategy == 3) { // 只缓存压缩后的图片options.diskCacheStrategy(DiskCacheStrategy.RESOURCE); // 设置指定的缓存策略} else if (mCacheStrategy == 4) { // 同时缓存原始图片和压缩图片options.diskCacheStrategy(DiskCacheStrategy.ALL); // 设置指定的缓存策略}// 在图像视图上展示网络图片。apply方法表示启用指定的请求选项builder.apply(options).into(iv_network);}}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="5dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="30dp"android:orientation="horizontal"><CheckBoxandroid:id="@+id/ck_seize"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="left|center"android:text="是否启用占位图"android:textColor="#000000"android:textSize="17sp" /><CheckBoxandroid:id="@+id/ck_error"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="left|center"android:text="是否启用出错图"android:textColor="#000000"android:textSize="17sp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="30dp"android:orientation="horizontal"><CheckBoxandroid:id="@+id/ck_original"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="left|center"android:text="是否加载原图片"android:textColor="#000000"android:textSize="17sp" /><CheckBoxandroid:id="@+id/ck_transition"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="left|center"android:text="是否呈现渐变动画"android:textColor="#000000"android:textSize="17sp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="缓存策略:"android:textColor="@color/black"android:textSize="17sp" /><Spinnerandroid:id="@+id/sp_cache_strategy"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:spinnerMode="dialog" /></LinearLayout><ImageViewandroid:id="@+id/iv_network"android:layout_width="match_parent"android:layout_height="250dp" />
</LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二级导航栏

简介&#xff1a;本文通过HTML与CSS相集合的方式&#xff0c;来实现二级导航菜单。 HTML构建骨架 <body><ul class"nav1"><li>水果<ul class"nav2"><li>苹果</li><li>香梨</li><li>火龙果</li…

windows常见的命令操作大全

目录 一、目录文件操作 cd命令 dir命令 md命令 rd命令 move命令 copy命令 del命令 二、文本相关操作 type命令 >命令 findstr命令 |命令 三、网络相关操作 小建议&#xff1a;跟着文章亲手敲一遍是避免忘记的有效方法 一、目录文件操作 cd命令 功能&#xf…

JavaScript流程控制-循环(循环(for 循环,双重 for 循环,while 循环,do while 循环,continue break))

目录 JavaScript流程控制-循环 循环 for 循环 执行过程&#xff1a; 断点调试&#xff1a; 案例一&#xff1a;求1-100之间所有整数的累加和 案例二&#xff1a;求1-100之间所有数的平均值 案例三&#xff1a;求1-100之间所有偶数和奇数的和 案例四&#xff1a;求1-10…

HashMap的面试题

目录 1、底层数据结构 1.7和1.8有何不同 2、为什么用红黑树&#xff0c;为何不一上来就树化&#xff0c;树化阈值为何是8&#xff0c;何时会树化&#xff0c;何时会退化为链表 3、索引如何计算&#xff1f;hashCode都有了&#xff0c;为何还要提供hash()方法&#xff1f;数组…

ArcGIS计算地形湿度指数

TWI是区域地形对径流流向和蓄积影响的物理指标&#xff0c;有助于识别降雨径流模式、潜在土壤含水量增加区域和积水区域。 计算方法&#xff1a;TWI是通过细尺度地形与上梯度对地表面积的贡献相互作用&#xff0c;根据以下关系得到的(Beven et al.,1979) [1] : TWI ln [CA/…

用专业团队管理软件工具轻松“拿捏”年轻运营团队

本文旨在抛砖引玉&#xff0c;欢迎大家拍砖讨论&#xff0c;通过一款时下流行的专业团队管理软件飞项做案例&#xff0c;一起探讨和交流团队管理专业工具软件和一些对应的方法论。 说到国内这几年流行起来的团队管理工具软件&#xff0c;我们先看看互联网这几年的发展。这几年&…

京东面试题:ElasticSearch 深度分页解决方案

前言 Elasticsearch 是一个实时的分布式搜索与分析引擎&#xff0c;在使用过程中&#xff0c;有一些典型的使用场景&#xff0c;比如分页、遍历等。 在使用关系型数据库中&#xff0c;我们被告知要注意甚至被明确禁止使用深度分页&#xff0c;同理&#xff0c;在 Elasticsearc…

【Python实战】听书就用它了:海量资源随便听,内含几w书源,绝对精品哦~(好消息好消息)

前言 有温度 有深度 有广度 就等你来关注哦~ 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 哈喽&#xff01;我是栗子同学&#xff0c;继续更新——今天聊一聊“西马拉雅”。&#xff08;谐音…

特征选择-sklearn

sklearn特征选择:移除低方差特征&#xff1a;单变量特征选择递归特征消除基于模型的SelectFromModel顺序特征选择特征选择作为pipline的一部分sklearn.feature_selection模块中的类可用于样本集的特征选择/降维&#xff0c;以提高估计器的准确性得分或提高其在非常高维的数据集…

BL200OPC UA分布式IO系统接线方式

BL200OPC UA 数据点 Node Id OPC UA 的 Node Id 默认是 NS1&#xff1b;SI/O 数据点的 Modbus 映射地址(如首个 DO 模 块第一路 DO&#xff1a;NS1&#xff1b;S1000)&#xff0c;具体 Modbus 映射地址参考 5.1.4Modbus 寄存器映射&#xff0c; 如果是自定义的 OPC UA 模型 Nod…

(02)Cartographer源码无死角解析-(19) SensorBridge→雷达点云数据预处理(函数重载)

本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 …

3.35 OrCAD中怎么产生Cadence Allegro的第一方网表?OrCAD软件输出Cadence Allegro第一方网表报错时应该怎么处理?

笔者电子信息专业硕士毕业&#xff0c;获得过多次电子设计大赛、大学生智能车、数学建模国奖&#xff0c;现就职于南京某半导体芯片公司&#xff0c;从事硬件研发&#xff0c;电路设计研究。对于学电子的小伙伴&#xff0c;深知入门的不易&#xff0c;特开次博客交流分享经验&a…

cpu与指令集

讨论一下 作为一个java程序员&#xff0c;我们都知道&#xff0c;当我们写完代码&#xff0c;java文件会被编译为class文件&#xff0c;然后交给jvm去执行&#xff0c;那么这个执行过程是啥样的呢&#xff1f;&#xff1f; 一般我们得到的解答都是&#xff0c;class代码会被解…

2、HTML——标题分组、居中、引用标签、水平线标签下划线标签、删除标签、<font>标签、图像标签

目录 一、基本标签 1、标题分组&#xff1a;hgroup 2、居中&#xff1a;center 3、引用标签 3.1 块&#xff08;长&#xff09;引用标签&#xff1a;blockquote 3.2 短引用标签&#xff1a;q 4、水平线标签&#xff1a;hr 5、下划线标签&#xff1a;ins 6、删除标…

【论文笔记之 BLMS】Block Implementation of Adaptive Digital Filters

本文对 GREGORY A. CLARK 于 1981 年在 IEEE Transactions on Circuits and Systems 上发表的论文进行简单地翻译。如有表述不当之处欢迎批评指正。欢迎任何形式的转载&#xff0c;但请务必注明出处。 论文链接&#xff1a;https://ieeexplore.ieee.org/abstract/document/108…

安利几个小技巧教会你ppt如何转pdf

作为一名打工人&#xff0c;特别是办公类&#xff0c;经常是要处理大大小小的文件&#xff0c;有时候甚至要做多种文件转换。并且老板都是多变的&#xff0c;经常突然性就让你把辛苦制作一大半的PPT转成PDF格式的文件再给他。那刚入门的职场小白肯定就会选择&#xff0c;老老实…

我终于读懂了适配器模式。。。

文章目录&#x1f5fe;&#x1f306;什么是适配器模式&#xff1f;&#x1f3ef;类适配器模式&#x1f3f0;对象适配器模式⛺️接口适配器模式&#x1f3ed;适配器模式在SpringMVC 框架应用的源码剖析&#x1f5fc;适配器模式的注意事项和细节&#x1f306;什么是适配器模式&am…

自学软件测试?一般人我还是劝你算了吧...

本人7年测试经验&#xff0c;在学测试之前对电脑的认知也就只限于上个网&#xff0c;玩个办公软件。这里不能跑题&#xff0c;我为啥说&#xff1a;自学软件测试&#xff0c;一般人我还是劝你算了吧&#xff1f;因为我就是那个一般人&#xff01; 软件测试基础真的很简单&…

C# Socket

一 两个人在两个房间里打电话的图 ① 人通过【电话】可以通信&#xff1b; ② 程序通过【Socket】来通信&#xff1b; ③ *套接字 就是 程序间的电话机&#xff1b; ④ 我和孙权打电话 电话 规定好的语言&#xff1b; ⑤ 电脑和电话进行联系 协议&#xff1b; 二 Socket相关…

JVM(二十三)—— 垃圾回收器(三)G1垃圾回收器

G1垃圾回收器:区域化分代式G1概述G1的特点&#xff08;优势&#xff09;G1的缺点G1的参数设置G1的适用场景分区region&#xff1a;化整为零记忆集和写屏障G1回收器垃圾回收过程年轻代GC并发标记过程混合回收G1概述 应用程序所应对的业务越来越庞大&#xff0c;复杂&#xff0c…