【小白 新手向】 图片三级缓存的快乐你真的GET到了吗?看完必入门的文章。(转载)

本文主要是介绍【小白 新手向】 图片三级缓存的快乐你真的GET到了吗?看完必入门的文章。(转载),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

图片三级缓存
(零)图片三级缓存的具体实现步骤
(一)网络缓存
NetCacheUtils网络缓存工具类
(二)本地缓存
工具类 MD5Encoder 加密
LocalCacheUtels 本地缓存工具类
(三)内存缓存
MemoryCacheUtils 内存缓存工具类
(四)图片三级缓存工具类整合
(零)图片三级缓存的具体实现步骤

  • 三级缓存设计步骤:
  • 从内存中取图片
  • 从本地文件中取图片
  • 向内存中保持一份
  • 请求网络图片,获取图片,显示到控件上(Hanlder,postion):
  • 向内存 存一份
  • 向本地文件中存一份
    1
    2
    3
    4
    5
    6
    7
    8
    9
    因此我们的储存的逻辑是从网络请求开始写的,第二步实现本地缓存,第三步最后实现内存缓存。

其中从内存缓存中获取最快,本地缓存次之,网络请求垫底。

(一)网络缓存
因为网络缓存中需要,向内存 存一份,向本地文件中存一份,因此需要把内存和本地缓存的工具类实例传进来。

NetCacheUtils网络缓存工具类
public class NetCacheUtils {

//请求图片成功
public static final int SUCESS = 1;
public static final int FAIL = 2;//本地缓存工具类
private final LocalCacheUtels localCacheUtils;//内存缓存工具类
private final MemoryCacheUtils memoryCacheUtils;//线程池服务类
private ExecutorService service;public NetCacheUtils( LocalCacheUtels localCacheUtels, MemoryCacheUtils memoryCacheUtils) {this.localCacheUtils = localCacheUtels;this.memoryCacheUtils = memoryCacheUtils;
}//联网请求得到图片
public void getBitmapFromNet(String imageUrl, int position) {service= Executors.newFixedThreadPool(10);service.execute(new MyRunnable(imageUrl,position));
}class MyRunnable implements Runnable{private final int position;private String imageUrl;public MyRunnable(String imageUrl, int position) {this.imageUrl = imageUrl;this.position = position;}@Overridepublic void run() {//子线程//请求网络图片try {HttpURLConnection connection = (HttpURLConnection) new URL(imageUrl).openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(4000);connection.setReadTimeout(4000);connection.connect();//可写 可不写int code = connection.getResponseCode();if (code == 200){InputStream is = connection.getInputStream();Bitmap bitmap = BitmapFactory.decodeStream(is);//在内存中缓存一份memoryCacheUtils.putBitmap(imageUrl,bitmap);//在本地中缓存一份localCacheUtils.putBitmap(imageUrl,bitmap);}} catch (IOException e) {e.printStackTrace();}}
}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
(二)本地缓存
工具类 MD5Encoder 加密
//该工具类直接复制粘贴 即可使用
public class MD5Encoder {
public static String encode(String string) throws Exception {
byte[] hash = MessageDigest.getInstance(“MD5”).digest(string.getBytes(“UTF-8”));
StringBuilder hex = new StringBuilder(hash.length * 2);
for (byte b : hash) {
if ((b & 0xFF) < 0x10) {
hex.append(“0”);
}
hex.append(Integer.toHexString(b & 0xFF));
}
return hex.toString();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
LocalCacheUtels 本地缓存工具类
class LocalCacheUtels {

private final MemoryCacheUtils memoryCacheUtils;//传入内存缓存工具类实例
public LocalCacheUtels(MemoryCacheUtils memoryCacheUtils) {this.memoryCacheUtils = memoryCacheUtils;
}/*** 获取储存图片* @param imageUrl* @return*/
public Bitmap getBitmapFromUrl(String imageUrl) {//判断sd卡是否可用if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){try {String fileName = MD5Encoder.encode(imageUrl);File file = new File("/data/data/com.coderpig.beijingnews/beijingnews/",fileName);if (file.exists()){FileInputStream is = new FileInputStream(file);Bitmap bitmap = BitmapFactory.decodeStream(is);if (bitmap!=null){memoryCacheUtils.putBitmap(imageUrl,bitmap);LogUtil.e("从本地保存到内存中");}return bitmap;}} catch (Exception e) {e.printStackTrace();LogUtil.e("图片本地获取失败");}}return null;
}/*** 根据Url 保存图片* @param imageUrl:url* @param bitmap:图片*/
public void putBitmap(String imageUrl, Bitmap bitmap) {//保存图片在 /mnt/sdcard/beijingnews/http://。。。。。///data/data/com.coderpig.beijingnews/beijingnews//判断sd卡是否可用if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){try {String fileName = MD5Encoder.encode(imageUrl);//LogUtil.e("图片保存地址是:" + Environment.getExternalStorageDirectory().toString());File file = new File("/data/data/com.coderpig.beijingnews/beijingnews/",fileName);if (!file.exists()){file.createNewFile();}//保存图片bitmap.compress(Bitmap.CompressFormat.PNG,100,new FileOutputStream(file));LogUtil.e("图片本地缓存--成功");} catch (Exception e) {e.printStackTrace();LogUtil.e("图片本地缓存--失败");}}}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
(三)内存缓存
MemoryCacheUtils 内存缓存工具类
不得不提一下LruCache是面试常客,知道怎么用,却不知道它是怎么干的,这就出大问题,知其然得知其所以然,下面这篇链接的文章 可以带你进行一次源码层的遨游。
LruCache实现原理分析 作者:胖子爱你520

class MemoryCacheUtils {

private LruCache<String, Bitmap> lruCache;public MemoryCacheUtils() {//使用系统分配给应用的内存的八分之一int maxSize = (int) (Runtime.getRuntime().maxMemory()/8);lruCache = new LruCache<String, Bitmap>(maxSize){@Overrideprotected int sizeOf(String key, Bitmap value) {return value.getRowBytes() * value.getHeight();}};}/*** 根据url去取* @param imageUrl* @return*/
public Bitmap getBitmapFromUrl(String imageUrl) {return lruCache.get(imageUrl);
}/*** 根据ur保存图片到lrucache集合中* @param imageUrl* @param bitmap*/
public void putBitmap(String imageUrl, Bitmap bitmap) {lruCache.put(imageUrl,bitmap);
}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
(四)图片三级缓存工具类整合
private MemoryCacheUtils memoryCacheUtils;

public BitmapCacheUtils(){memoryCacheUtils = new MemoryCacheUtils();localCacheUtels = new LocalCacheUtels(memoryCacheUtils);netCacheUtils = new NetCacheUtils(localCacheUtels,memoryCacheUtils);
}/*** 三级缓存设计步骤:* 从内存中取图片** 从本地文件中取图片* 向内存中保持一份** 请求网络图片,获取图片,显示到控件上(Hanlder,postion):* 向内存 存一份* 向本地文件中存一份* @param imageUrl* @param position* @return*/
public Bitmap getBitmap(String imageUrl, int position) {//1.从内存中取图片if (memoryCacheUtils!=null){Bitmap bitmap = memoryCacheUtils.getBitmapFromUrl(imageUrl);if (bitmap != null){LogUtil.e("内存加载图片==成功"+position);return bitmap;}}//2.从本地文件中取图片if (localCacheUtels != null){Bitmap bitmap = localCacheUtels.getBitmapFromUrl(imageUrl);if (bitmap != null){LogUtil.e("本地加载图片==成功"+position);return bitmap;}}//3.请求网络图片,获取图片netCacheUtils.getBitmapFromNet(imageUrl,position);return null;
}

}

原文链接:https://blog.csdn.net/weixin_42765222/article/details/107595950?utm_medium=distribute.pc_feed.none-task-blog-alirecmd-4.nonecase&depth_1-utm_source=distribute.pc_feed.none-task-blog-alirecmd-4.nonecase&request_id=

这篇关于【小白 新手向】 图片三级缓存的快乐你真的GET到了吗?看完必入门的文章。(转载)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/480924

相关文章

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php

使用Python实现一个简易计算器的新手指南

《使用Python实现一个简易计算器的新手指南》计算器是编程入门的经典项目,它涵盖了变量、输入输出、条件判断等核心编程概念,通过这个小项目,可以快速掌握Python的基础语法,并为后续更复杂的项目打下... 目录准备工作基础概念解析分步实现计算器第一步:获取用户输入第二步:实现基本运算第三步:显示计算结果进

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成