一概述

Glide 的横空出世,在图片框架领域打败了一众强劲的对手。有老牌王者 ImageLoader ,也有新贵 Picasso 、Fresco。私以为 Picasso (毕加索) 的名字最有意境,奈何 Glide 武功更胜一筹,人们只记得谁第一个登上了月球,谁第一个踏上了南极点,自然而然 Glide 在 Android 图片框架占有率牢牢的坐上的第一宝座。

虽然只是使用第三方,我们可以做得很没有深度 “with+load+into” 一下;也可以把 Glide 那么多的用法策略烂熟于胸能够实际解决业务上遇到的问题;还可以深入 Glide 源码学习他的设计理念、设计思路、框架封装、设计模式来提升我们代码的基本功。

今天偶然我看到微信有个设置聊天背景功能随意试了一张大图,发现他加载很迅速,体验很好。不确定微信底下是不是使用的 Glide 也不知道微信的缓存策略,就看看如果是我遇到一个大图加载的需求能不能做到极速的加载,如果是本地磁盘图片是怎么样。如果是一个网络图片资源又怎么样,Glide又有什么样的缓存策略让我们来应对不同的场景,我们一起来探究一下吧~!

二 实践
我们选取了一张 3.5MB 的本地资源,我们看下各种场景加载速度并且将他们打印出来

1 加载本地资源 By ImageView

private void loadLocalImageView(String url) {
    long startTime = System.currentTimeMillis();
 Glide.with(this).load(url).into(img);
 Log.e("zxm", "loadLocalImageView time : " + (System.currentTimeMillis() - startTime));
}

Android Glide加载图片并设置宽高 glide加载大图_缓存


2 加载本地资源 drawable

private void loadLocalDrawable(String url) {
        final long startTime = System.currentTimeMillis();
 Glide.with(this).asDrawable().load(url).into(new SimpleTarget<Drawable>() {
            @Override
 public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                root.setBackground(resource);
 Log.e("zxm", "loadLocalDrawable time : " + (System.currentTimeMillis() - startTime));
 }
        });
 }

Android Glide加载图片并设置宽高 glide加载大图_android_02


我们可以看到的是同样是本地图片资源,转为 drawable 方式去加载竟然耗时 0.52 秒,即使后面有缓存也达到了 0.12 秒左右。这样的加载速率基本是肉眼可以感知到的。给用户的感觉也有是闪烁了一下

体验自然就会变差一些,另外这种转换的方式还包含转换成 bitmap 等情况。

Glide 网络资源加载

Android Glide加载图片并设置宽高 glide加载大图_缓存_03

我们从百度图库里面获取了一张 3.7MB 的网络资源图片(上图)

1 网络资源 + ImageView

private void loadHttpImageView(String url) {
    long startTime = System.currentTimeMillis();
 Glide.with(this).load(url).into(img);
 Log.e("zxm", "loadHttpImageView time : " + (System.currentTimeMillis() - startTime));
}

Android Glide加载图片并设置宽高 glide加载大图_ide_04


让我意向不到的是加载网络资源竟然和本地资源速度差不多

1 网络资源 + drawable

private void loadHttpDrawable(String url) {
    long startTime = System.currentTimeMillis();
 Glide.with(this).asDrawable().load(url).into(new SimpleTarget<Drawable>() {
        @Override
 public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
            root.setBackground(resource);
 Log.e("zxm", "loadLocalDrawable time : " + (System.currentTimeMillis() - startTime));
 }
    });
}

Android Glide加载图片并设置宽高 glide加载大图_加载_05

网络加 drawable 第一次竟然达到了惊人的 0.75 秒 ,后面有缓存以后好不少速度快了 8 倍以上。

个人理解是在异步转化 drawable 和 bitmap 的过程中底下有大量的 IO 耗时操作去做数据转化,至于为什么 ImageView 第一次也这么快,这个还有待我们去做源码层面的探究

得出结论及时在本地磁盘上的图片,也需要根据场景考虑控件选型。到底是使用 ImageView 还是 drawable 还是 bitmap 我们需要慎重考虑加载转换速度的影响。