Android实现缓存大图到SD卡
作者:_万能的博哥 发布时间:2022-07-13 07:13:50
标签:Android,缓存,SD卡
本文实例为大家分享了Android实现缓存大图到SD卡的具体代码,供大家参考,具体内容如下
该功能主要针对资源图片过大占用apk体积,所以先将图片事先下载,在通过Glide加载时先去本地取,取值成功时直接应用且节省了时间,若本地图片不存在或取值失败等,在通过网络加载。。。
1、开启子线程
2、通过图片url进行本地缓存
3、判断SD是否挂载
4、判断本地是否存在该文件
5、存在将文件放到指定路径下
public void downloadOnly(@Nullable final List<String> imageUrlList) {
if (Tools.isEmpty(imageUrlList)) {
return;
}
if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
return;
}
new Thread(new Runnable() {
@Override
public void run() {
final File parent = MainApplication.getContext().getExternalCacheDir();
for (String url : imageUrlList) {
try {
File tempFile = findImageByUrl(url, Tools.getApplication());
if (tempFile == null) {
File file = Glide
.with(MainApplication.getContext())
.load(url)
.downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.get();
Uri uri = Uri.parse(url);
String fileName = uri.getLastPathSegment();
if (Tools.notEmpty(fileName)) {
copy(file, new File(parent, uri.getLastPathSegment()));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
//复制文件
public void copy(File source, File target) {
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(source);
fileOutputStream = new FileOutputStream(target);
byte[] buffer = new byte[1024];
while (fileInputStream.read(buffer) > 0) {
fileOutputStream.write(buffer);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fileInputStream != null) {
fileInputStream.close();
}
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
1、判断SD是否挂载
2、判断文件URL是否为空
3、判断文件是否存在
//查找本地文件是否存在
@Nullable
public static File findImageByUrl(@Nullable String url, @Nullable Context context) {
if (Tools.isEmpty(url) || context == null) {
return null;
}
try {
if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
return null;
}
Uri uri = Uri.parse(url);
String fileName = uri.getLastPathSegment();
if (Tools.notEmpty(fileName)) {
File file = new File(context.getExternalCacheDir(), fileName);
return file.exists() ? file : null;
}
} catch (Exception e) {
return null;
}
return null;
}
如上流程操作后,网络稳定的情况下已经将文件下载到本地了,只需调用该方法加载即可,如若网络不稳定的没下载成功情况下也没事,glide会协助加载的!!!
/**
* 加载图片
* 先从缓存中根据url对应名称判断是否有图片
*/
public static void loadImageByCacheFirst(Context context, String url, ImageView imageView) {
try {
if (context == null) {
return;
}
File file = findImageByUrl(url, context);
if (file != null) {
Glide.with(context).load(file).into(imageView);
} else {
Glide.with(context).load(url).into(imageView);
}
} catch (Throwable t) {
t.printStackTrace();
}
}
来源:https://blog.csdn.net/weixin_43917449/article/details/115124864


猜你喜欢
- 一、如何显示assets/license.txt(中文)的内容? (1)方法1:InputStream.available()得到字节数,然
- 今天在码代码的时候突然想到这个问题,觉得有点困惑。在网上也翻阅不少帖子其中有一个帖子给了我一个思路,其实也是解释了基础概念。概念一:try
- 本次数据请求使用postman, postman下载地址:https://www.getpostman.com/一、页面跳转1. 页面跳转@
- 一、定时任务的使用场景和常见的定时任务某个时间定时处理某个任务、发邮件、短信、消息提醒、订单通知、统计报表等定时任务划分单机定时任务:单机的
- <dependency> <groupId>org.projectlombok</g
- 提几个问题,从问题中去了解去学习:他们之间有啥区别?如果我使用notify(),将通知哪个线程?我怎么知道有多少线程在等待,所以我可以使用n
- 随着互联网技术的发展,传统的应用架构已满足不了实际需求,微服务架构就随之产生。那么传统应用架构到底出了什么问题呢?又如何解决?接下来我们将从
- 前言Webp是Google推出的一种新型图片格式,相比于 传统的PNG/JPG图片有着更小体积的优势,在Web中有着广泛的应用。由于Webp
- 一、redis key数量为1千万时。存储value为"0",比较小。如果value较大,则存储内存会增多redis k
- 前置知识Kotlin协程不是什么空中阁楼,Kotlin源代码会被编译成class字节码文件,最终会运行到虚拟机中。所以从本质上讲,Kotli
- Android对sdcard扩展卡文件的操作其实就是普通的文件操作,但是仍然有些地方需要注意。比如:1.加入sdcard操作权限;2.确认s
- 本文实例为大家分享了android选择视频文件上传到后台服务器的具体代码,供大家参考,具体内容如下选择本地视频文件附上Demo首先第一步打开
- package com.chen.lucene.image;import java.io.File;import java.io.FileI
- 很多小伙伴刚刚接触.net这一平台,可能不清楚如何安装最新版本VS 来搭建一个好用的编译器;本文将引导大家安装VS2019 C#语言的安装第
- Android Studio从3.0版本新增了许多功能,当然首当其冲就是从3.0版本新增了对 Kotlin 开发语言的支持,除此之外还有其他
- Android EditText输入手机号空格开发需求是在登录页面的手机EditText中间插入空格,让用户看起来方便点, 130 1234
- 实现效果:Form1.cs代码:using System;using System.Collections.Generic;using Sy
- 饿汉式立即加载防止new对象,构造私有,写一个公共的方法返回对象占用空间,线程安全public class Singleton { &nbs
- 最近在公司,项目不是很忙了,偶尔看见一个兄台在CSDN求助,帮忙要一个自定义的渐变色进度条,我当时看了一下进度条,感觉挺漂亮的,就尝试的去自
- 今天看到一个ios写的图灵机器人,直接去官网(http://www.tuling123.com/openapi/)看了下API接入,太简单了