欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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();
    }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。