第一步:
代码中添加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 也过大。
解决方案:
- 先 /app/main/assets/default_image/ 目录下的图片批量重名命为.png 格式,
Windows 下批量重命名的方法;
在当前目录新建一个文本文件,内容为:
ren *. *.png
保存文件格式为rename.bat
双击这个文件运行。
- 打开Android studio ,找到 /app/main/assets/default_image/ 按住shift 键,用鼠标选中该目录下的所有图片文件,右键 点击
Convert to WebP
- 再次使用 .bat 命令,将所有转换后的WebP格式的图片,去掉后缀名,在png转成WebP 的过程中,图片的大小减少了许多,而不会影响图片的质量。
bat命令如下:
ren *.webp *.