关于实现线上图片缓存到本地,实现无网无缓存时也能有数据的功能

第一步:

代码中添加ImageDownloader,下载线上图片,代码如下:

public class ImageDownloader {
    private Downloader downloader;
    private static final ImageDownloader ourInstance = new ImageDownloader();

    public static ImageDownloader getInstance() {
        return ourInstance;
    }

    private ImageDownloader() {

        File downloadFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        if (downloadFile != null) {

        }
        Downloader.Builder builder = new Downloader.Builder();
        builder.context(BaseApplication.getInstance());

        Config config = new Config() {
            @Override
            public String getCacheRootPath() {
                return "default_image/";
            }

            @Override
            public String getPublicTypePath() {
                return null;
            }


            @Override
            public String getFileName(String url) {
                return getNameByUrl(url);
            }
        };

        builder.setConfig(config);

        downloader = builder.build();

    }

    public void setListener(DownloadProgressListener listener) {
        downloader.setListener(listener);
    }

    public TaskResult downloadImage(String imageUrl) {
        Log.d("downloadImage", imageUrl);

        return downloader.addTask(imageUrl, null);
    }

    private static String getNameByUrl(String url) {
        String name = MD5(url);
        return name;
    }


    public static String convert(String url) {

        if (!TextUtils.isEmpty(url)) {
            url = String.format("file:///android_asset/default_image/%s", getNameByUrl(url));
            Log.d("downloadImage", url);
        }
        return url;
    }

    public static String MD5(String inStr) {
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
        } catch (Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
            return "";
        }
        char[] charArray = inStr.toCharArray();
        byte[] byteArray = new byte[charArray.length];
        for (int i = 0; i < charArray.length; i++)
            byteArray[i] = (byte) charArray[i];
        byte[] md5Bytes = md5.digest(byteArray);
        StringBuffer hexValue = new StringBuffer();
        for (int i = 0; i < md5Bytes.length; i++) {
            int val = ((int) md5Bytes[i]) & 0xff;
            if (val < 16)
                hexValue.append("0");
            hexValue.append(Integer.toHexString(val));
        }
        return hexValue.toString();
    }

}


第二步:

在viewHolder 加载图片的地方判断,无网络时设置缓存图:

    if (!NetworkUtils.isNetworkOpen(getContext())){
            url = ImageDownloader.convert(url);
        }

第三步:

联网,等待数据加载完毕,获取缓存图,目录在:
/data/data/{包名}/cache/image_manager_disk_cache/
将改目录下所有文件拷贝到 项目 /app/main/assets/default_image/ 目录下


会遇到的问题:

图片内存过大,导致打包出来的apk 也过大。

解决方案:

  1. /app/main/assets/default_image/ 目录下的图片批量重名命为.png 格式,
    Windows 下批量重命名的方法;
    在当前目录新建一个文本文件,内容为:
   ren *. *.png
  保存文件格式为rename.bat  
  双击这个文件运行。
  1. 打开Android studio ,找到 /app/main/assets/default_image/ 按住shift 键,用鼠标选中该目录下的所有图片文件,右键 点击 Convert to WebP

图片格式转WebP

  1. 再次使用 .bat 命令,将所有转换后的WebP格式的图片,去掉后缀名,在png转成WebP 的过程中,图片的大小减少了许多,而不会影响图片的质量。
    bat命令如下:
 ren *.webp *.

到此就完成了线上图片的本地无网时的缓存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心影流年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值