Android使用Glide下载图片的正确姿势

使用前须知:
  • Glide是一个专注于平滑滚动的图片加载和缓存库。
  • 项目中如果用到Glide去加载和缓存图片,那么下载这些图片又应该怎么处理呢?
  • 一种解决就是使用本库所提供的使用GlideDown去下载图片
  • 所以本库依赖于Glide 2.8版本
  • 好处是如果有缓存,则优先使用缓存来下载图片,避免重复的网络请求
  • 关于本库使用到的一下权限,需要开发者在6.0+的手机上自行动态申请

    1
    2
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
除了下载图片还能做什么?
  • 提供4中方式添加存储路径和图片的网络地址
  • 如果不想提供下载图片后保存的文件名,可以只提供下载存储的文件夹路径
  • 可以设置下载后的图片显示在系统相册中
  • 可以下载过程中取消下载任务
  • 下载多图,如果其中一张下载设置,可以设置是否中断后续下载任务
  • 设置是否提供下载过程中的日志显示
  • 目标文件已存在的话,可以设置是否覆盖目标文件
  • 提供图片下载进度对话框,实时显示下载进度
  • 提供必要的回调接口,开发者可以自定义处理各种事件
怎么引入到自己项目中:
  • 主项目build.gradle中的repositories节点下添加如下代码

    1
    maven { url "http://nexus.iamfan.cn/repository/android/" }
  • 在需要引入的moudle中的build.grade中的dependencies节点下添加如下代码

    1
    compile('ren.helloworld:glidedown:1.14@aar') { transitive = true }
提供的方法及解释:
  • GlideDown.class类所提供的 :
方法名 解释
down(Map<String,String>map) 添加存储路径和图片网络地址的Map<savePath,downUrl>集合
down(String saveDirPath,List<String> downUrls) 添加存储图片的文件夹路径和图片网络地址集合List<downUrls>
down(List<String> savePaths, List<String> downUrls) 添加存储路径集合和图片网络地址集合
down(String savePath, String downUrl) 添加存储路径和图片网络地址
showDialog(boolean isShowDialgo) 下载过程中是否显示进度条对话框,默认为false
showDialog(String dialogTitle) 下载过程中显示进度条对话框,并设置对话框的标题
cancelButton(boolean cancelButton) 下载过程中是否显示取消下载的按钮,默认为false
scanImage(boolean isScanImage) 下载成功的图片是否需要显示在系统相册中,默认为true
failureblock(boolean isFailureBlock) 下载多图时,如果其中一张下载失败,是否中断后面的下载,默认为true
overwrite(boolean isOverwrite) 如果需要下载的图片已经存在,是否继续下载并覆盖原文件,默认为false
debug(boolean isDebug) 下载过程中是否输出日志,默认为false
enqueue(Listener listener) 执行下载,监听可以为null
  • GlideDown.Listener.class所提供的 :
方法名 解释
onBefore() 主线程 非必
开始下载之前会调用此方法
onProgress(int i) 主线程 非必
下载第i张图片时会调用此方法
onSuccessOne(int i, File file) 主线程 非必
第i张图片下载成功后会调用此方法,并回调下载成功后的文件
onSuccess(LinkedList<String> strings) 主线程 必须
所有的图片下载完成后会调用此方法
onFailure(int i, String errmsg) 主线程 必须
第i张图片下载失败后会调用的方法,并回调失败的原因
onAfter() 主线程 非必
图片无论是下载成功还是失败,都会在最后调用的方法
关于混淆
  • 本库已经内置了混淆规则,混淆规则如下,如果需要额外的混淆规则,请在app moudle的混淆规则中添加。

    1
    2
    3
    4
    5
    -keep public class * implements com.bumptech.glide.module.GlideModule
    -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
    **[] $VALUES;
    public *;
    }
关于测试部分
  • app moudle中的MainActivity类中已有简单的测试代码。代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
       private void down() {
    String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/GlideDown";
    String ss_p = dirPath + "/ss.jpg";
    String ss_d = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1488440549345&di=38b952767d660a9a1128a16b6f54c830&imgtype=0&src=http%3A%2F%2Fwapfile.desktx.com%2Fpc%2F170104%2Fbigpic%2F5864a73ded7df.jpg";

    List<String> sl = new ArrayList<>();
    sl.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1488440549345&di=74e26d9ab9ad9559502d711c7f19d9cd&imgtype=0&src=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fupload%2Fupc%2Ftx%2Fwallpaper%2F1212%2F13%2Fc0%2F16574646_1355387800466_800x600.jpg");
    sl.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1488440549344&di=5ff0a690713e5289b22590ed0002114e&imgtype=0&src=http%3A%2F%2Fuploads.xuexila.com%2Fallimg%2F1702%2F966-1F21Q01S7.jpg");

    List<String> ll_p = new ArrayList<>();
    ll_p.add(dirPath + "/ll_1.jpg");
    ll_p.add(dirPath + "/ll_2.jpg");
    List<String> ll_d = new ArrayList<>();
    ll_d.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1488440549344&di=fe6284a102e54e68e822940df637f23f&imgtype=0&src=http%3A%2F%2Fb.zol-img.com.cn%2Fdesk%2Fbizhi%2Fimage%2F4%2F960x600%2F1383276504143.jpg");
    ll_d.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1488440549344&di=c0d400610b65cde4874fd1acb83c3ec5&imgtype=0&src=http%3A%2F%2Fuploads.xuexila.com%2Fallimg%2F1701%2F966-1F116153608.jpg");

    Map<String, String> m = new HashMap<>();
    m.put(dirPath + "/m_1.jpg", "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1488440549341&di=e477965bba15a857f287b427d0946d98&imgtype=0&src=http%3A%2F%2Fb.zol-img.com.cn%2Fdesk%2Fbizhi%2Fimage%2F3%2F960x600%2F1380159960698.jpg");
    m.put(dirPath + "/m_2.jpg", "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1488440549340&di=1a984087d6a92b06e930467d43f4692b&imgtype=0&src=http%3A%2F%2Fwapfile.desktx.com%2Fpc%2F170104%2Fbigpic%2F5864a739c0c0d.jpg");

    new GlideDown(this)
    .down(ss_p, ss_d)
    .down(dirPath, sl)
    .down(ll_p, ll_d)
    .down(m)
    .showDialog(true)
    .skipDiskCache(true)
    .skipMemoryCache(true)
    .scanImage(true)
    .failureblock(false)
    .overwrite(true)
    .debug(true)
    .cancelButton(true)
    .enqueue(new GlideDown.Listener() {
    @Override
    public void onSuccess(LinkedList<String> linkedList) {

    }

    @Override
    public void onFailure(int i, String s) {

    }
    });
    }