Gilde简单介绍:
Glide是一款由图片加载框架,使得我们可以在Android平台上以极度简单的方式加载和展示图片
Glide.with(this).load(url).into(imageView)这是Glide的核心代码 他这行代码包括加载网络上的图片、加载手机本地的图片、加载应用资源中的图片
Glide.with()方法用于创建一个加载图片的实例
load()方法,这个方法用于指定待加载的图片资源
into()方法,这个方法就很简单了,我们希望让图片显示在哪个ImageView
在Gilde中我们可以指定加载图片的大小使用override()方法 在括号中传入自定义加载图片的大小
占位符:
在Gilde当中因为我们加载网络数据的时候 需要稍等一会图片才会加载出来 我们不能显示空白页面 所以我们要用到占位图我们只需要在刚才的三步走之间插入了一个placeholder()方法 在括号里传入一个图片路径就行了,我们在运行的时候 佷可能看不见占位图图片 因为Gilde有缓存功能 在第一次我们记载图片的时候他就已经缓存下来了 所以后面我们再次使用的时候 就可能看不见占位图图片 如果我们想看见 占位图图片可以在使用占位图方法后面加一个diskCacheStrategy()方法,并传入DiskCacheStrategy.NONE参数,这样就可以禁用掉Glide的缓存功能。
异常占位符
这只是占位图的一种,除了这种加载占位图之外,还有一种异常占位图。异常占位图就是指,如果因为某些异常情况导致图片加载失败,比如说手机网络信号不好,这个时候就显示这张异常占位图 error()方法就是可以指定异常占位图
Gilde有一个很强大的功能Glide是支持加载动态图片的。,Picasso是不会支持加载动态图片的 Gilde在加载图片的时候他在加载图片时会自动识别他的图片格式 然后对他进行加载
在Gilde中有很多方法 加载动态图片时 我们就想要第一帧 调用asBitmap()
只加载动态图片我们使用asGif()方法替代asBitmap()方法 如果不是动态图片 那么会加载失败
Gilde源码分析:
With()
在Gilde源码中 with()方法是一组静态方法,它有好几个方法重载with()方法的重载种类非常多,既可以传入Activity,也可以传入Fragment或者是Context 每一个with()方法重载的代码都非常简单,都是先调用RequestManagerRetriever的静态get()方法得到一个RequestManagerRetriever对象,这个静态get()方法就是一个单例实现,没什么需要解释的。然后再调用RequestManagerRetriever的实例get()方法,去获取RequestManager对象。
RequestManagerRetriever类中看似有很多个get()方法的重载,什么Context参数,Activity参数,Fragment参数等等,实际上只有两种情况而已,即传入Application类型的参数,和传入非Application类型的参数。
当我们在Glide.with()方法中传入的是一个Application对象,那么这里就会调用带有Context参数的get()方法重载,然后会调用getApplicationManager()方法来获取一个RequestManager对象
当我传入非Application参数的情况。不管你在Glide.with()方法中传入的是Activity、FragmentActivity、v4包下的Fragment、还是app包下的Fragment,最终的流程都是一样的,那就是会向当前的Activity当中添加一个隐藏的Fragment。为什么要添加一个隐藏的Fragment呢?因为Glide需要知道加载的生命周期
我们是在非主线程当中使用的Glide,那么不管你是传入的Activity还是Fragment,都会被强制当成Application来处理 with()方法其实就是为了得到一个RequestManager对象而已,然后Glide会根据我们传入with()方法的参数来确定图片加载的生命周期
Load()
load()方法是在RequestManager类当中的,在RequestManager中也有很多个load()方法的重载 load()方法首先调用fromString()方法,再调用load()方法,然后把传入的图片URL地址传进去 fromString()方法调用了loadGeneric()方法,并且指定参数为String.class,因为load()方法传入的是一个字符串参数 主要的工作都是在loadGeneric()方法中进行的
当中会调用两个方法来获取ModelLoader对象 Glide.buildStreamModelLoader()方法和Glide.buildFileDescriptorModelLoader()方法 ModelLoader对象是用于加载图片的,而我们给load()方法传入不同类型的参数,这里也会得到不同的ModelLoader对象 我们传入String.class会得到一个StreamStringLoader对象,它是实现了ModelLoader接口的
loadGeneric()方法是要返回一个DrawableTypeRequest对象的,因此在loadGeneric()方法的最后又去new了一个DrawableTypeRequest对象 然后把刚才获得的ModelLoader对象传进去,
Drawable4TypeRequest的作用它提供了asBitmap()和asGif()这两个方法,分别是用于强制指定加载静态图片和动态图片 DrawableTypeRequest的父类是DrawableRequestBuilder并不是load
Into()
into()方法的具体都是在DrawableRequestBuilder的父类GenericRequestBuilder中 在
GenericRequestBuilder中有一个glide.buildImageViewTarget()方法,这个方法会构建出一个Target对象,Target对象则是用来最终展示图片用的,在buildTarget()方法中会根据传入的class参数来构建不同的Target对象。class参数其实基本上只有两种情况,如果你在使用Glide加载图片的时候调用了asBitmap()方法,那么这里就会构建出BitmapImageViewTarget对象,否则的话构建的都是GlideDrawableImageViewTarget对象
Glide缓存
在缓存这一功能上,Glide又将它分成了两个模块,一个是内存缓存,一个是硬盘缓存。这两个缓存模块的作用各不相同,内存缓存的主要作用是防止应用重复将图片数据读取到内存当中,而硬盘缓存的主要作用是防止应用重复从网络或其他地方重复下载和读取数据。内存缓存和硬盘缓存的相互结合才构成了Glide极佳的图片缓存效果
内存缓存:
Gilde默认是缓存 当我们不想缓存时 只需要调用skipMemoryCache()方法并传入true,就表示禁用掉Glide的内存缓存功能 Glide内存缓存的实现使用的LruCache算法。不过除了LruCache算法之外,Glide还结合了一种弱引用的机制,共同完成了内存缓存功能
硬盘缓存:
调用diskCacheStrategy()方法并传入DiskCacheStrategy.NONE,就可以禁用掉Glide的硬盘缓存功能 在diskCacheStrategy()中有四种参数
DiskCacheStrategy.NONE: 表示不缓存任何内容。
DiskCacheStrategy.SOURCE: 表示只缓存原始图片。
DiskCacheStrategy.RESULT: 表示只缓存转换过后的图片(默认选项)。
DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
Glide和Picasso的区别
Glide是支持加载动态图片的。,Picasso是不会支持加载动态图片的
相对于加载图片Picasso比Glide开销要大,但是Picasso加载的图片比Glide质量要好
原因在于Picasso是加载了全尺寸的图片到内存,然后让GPU来实时重绘大小。而Glide加载的大小和ImageView的大小是一致的,因此开销小
Glide和Picasso都是非常完美的库。Glide加载图像以及磁盘缓存的方式都要优于Picasso,速度更快,并且Glide更有利于减少OutOfMemoryError的发生,GIF动画是Glide的杀手锏。不过Picasso的图片质量更高
因为Glide默认的Bitmap格式是RGB_565 ,比PicassoARGB_8888格式的内存开销要小一半
网友评论