Android实现缓存大图到SD卡
程序员文章站
2022-07-06 11:21:23
本文实例为大家分享了android实现缓存大图到sd卡的具体代码,供大家参考,具体内容如下该功能主要针对资源图片过大占用apk体积,所以先将图片事先下载,在通过glide加载时先去本地取,取值成功时直...
本文实例为大家分享了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(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。