Glide特点.
-
使用简单
-
可配置度高,自适应程度高
-
支持常见图片格式
Jpg png gif webp
-
支持多种数据源
网络、本地、资源、Assets 等
-
高效缓存策略
支持Memory和Disk图片缓存 默认Bitmap格式采用RGB_565内存使用至少减少一半
-
生命周期集成
根据Activity/Fragment生命周期自动管理请求
-
高效处理Bitmap
使用Bitmap Pool使Bitmap复用,主动调用recycle回收需要回收的Bitmap,减小系统回收压力
Glide是如何提高加载图片的性能?
通过控制图片大小.
-
.override(200,200)可以设置加载图片大小,但是实际大小不一定是200x200,通过源码分析下:
在BitmapRequestBuilder中的private Downsampler downsampler = Downsampler.AT_LEAST
默认就是设置了尺寸优化,超过最大比例的就会对图片进行等比例缩放,如何缩放见下面; -
在Downsampler中的decode方法中,获取的Bitmap大小变成1/sampleSize,倍数通过getSampleSize计算所得,
-
inSampleSize 是 BitmapFactory.Options的属性,应该大家都知道。然后再看看怎么生成.override(200,200),如果没有设置Glide默认是FitCenter,查看FitCenter可以看到图片截取方式。
-
举个例子:
加载的图片大小为1080x540,如果使用了.override(200,200)默认缓存一张200x100的图片,也就是默认存储结果RESULT.
通过设置Bitmap Format的图片类型
为了降低内存消耗,Glide默认配置的Bitmap Format 为 RGB_565,修改GlideBuilder's setDecodeFormat设置.
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
为何要使用额外的无界面的Fragment?
根据传入Context的类型有不同的实现,这里以FragmentActivity为例(现在常用的MD样式Activity类AppCompatActivity是FragmentActivity的子类)。方法get(FragmentActivity activity)调用了方法supportFragmentGet(activity, fm),后者返回的对象类型是SupportRequestManagerFragment 。SupportRequestManagerFragment 是一个无界面的Fragment类,起到把请求和Activity生命周期同步的作用。
Glide.with() 不仅仅只是Context还可以是Activity,Fragment等,传入后自动适配,Glide加载图片是会随着Activity,Fragment 的生命周期,具体可以参考LifecycleListener,所以推荐使用Activity,Fragment.
Glide的缓存策略是做的?
通过该方法设置策略.diskCacheStrategy(DiskCacheStrategy.ALL)
DiskCacheStrategy 分别有以下几种选择,ALL缓存原图和截取后的图,NONE 不缓存,SOURCE 只缓存原图,RESULT缓存截取后的图.
因此如果图片需要分享或需要原图的建议缓存ALL,否则只缓存RESULT.
这个核心的GlideModules的作用是什么?
是什么
-
GlideModule是对glide全局配置相关的类.
-
如可以设置缓存策略.
-
更多的配置如下
-
可以通过实现GlideModule接口来自定义一个Glide图库,可以通过他改变Glide的行为和基础配置.
在自定义GlideModule时需要注意什么?
要全局的去声明这个类,让 Glide 知道它应该在哪里被加载和使用。Glide 会扫描 AndroidManifest.xml 为 Glide module 的 meta 声明。具体可以查看源码在Glide.get(Context),通过ManifestParser对象获取GlideModule集合.
因此,你必须在 AndroidManifest.xml 的 < application> 标签内去声明这个刚刚创建的 Glide module。
-
创建GlideModel
public class MyGlideModule implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}