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
0
投稿
猜你喜欢
- 1.背景在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量。之前我们通常利用public final s
- springboot对压缩请求的处理最近对接银联需求,为了节省带宽,需要对报文进行压缩处理。但是使用springboot自带的压缩设置不起作
- 最好使用英文,不要用汉语拼音1:包(package):用于将完成不同功能的类分门别类,放在不同的目录(包)下,包的命名规则:将公司域名反转作
- Idea中directory和package的区别,要是错了就右键,make directory as 目录或者源代码目录(Source R
- 一种方法是可以在窗体的属性面板将窗体的 ControlBox属性设置为false,或者在窗体的构造函数中这样写:public F
- 本文实例讲述了Java定义泛型方法。分享给大家供大家参考,具体如下:一 点睛1 如果定义类、接口是没有使用类型形参,但定义方法时想自己定义类
- 介绍Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。Spring Cache提供了一
- 补充使用Spring Cloud Config加密功能需要下载JCE扩展,用于生成无限长度的密文。链接:http://www.oracle.
- 修改方法有两个1.方法1:点“编辑”-->“列选择模式”2.方法2:快捷键Shift+Alt+Insert修改后结果如下:来源:htt
- 上一篇说到Springboot整合Netty,自定义协议实现,本文聊一些拆包/沾包问题。拆包/沾包问题TCP是面向字节流的协议,在发送方发送
- 重新启动IDEA maven项目SSM框架所有@注解失效,每个文件上都有个小黄圆,而且我发现所有构建项目的maven的jar包都不在了,也就
- 一、spring-boot-devtools在pom中直接引入依赖<dependency> <groupId&
- 一、图形DrawableDrawable类型表达了各种各样的图形,包括图片、色块、画板、背景等。包含图片在内的图形文件放在res目录的各个d
- 目录Retrofit介绍Retrofit优点Retrofit的使用1.引入依赖项2.添加网络权限3.编写Retrofit辅助类4.定义Api
- 下载IDEA插件IDEA插件选择版本号下载与IDEA版本号相近的插件打开IDEA,导入下载好的插件在File下找到setting在Plugi
- 大致分为以下几个方面:一些查询指令整理使用SQL语句进行特殊查询检测表字段是否存在数据库升级数据库表字段赋初始值一、查询指令整理1.链式执行
- 迷宫项目实现设计文档项目介绍:一个网格迷宫由n行m列的单元格组成,每个大院个要么是空地(用0表示),要么是障碍物(用1表示)。你的任务是找一
- 给图片添加阴影效果,这是很常见的需求。第一种方法是自定义drawable,使用layer-list定义两个图片,代码如下:show_view
- 一、简介Lock关键字是Monitor的一种替换用法,lock在IL代码中会被翻译成Monitor. lock (obj) &nb
- 所谓c#的委托就是说把函数当参数来传递。这个在js完全就用不着搞什么委托东西,直接转就是了。而对于C#来说则不是这样!一个函数,如果它的参数