Glide 原理

Glide使用方式如下:

Glide.with(this).load(url).into(imageView);

基本用法:glide采用的都是流接口方式

简单的从网络加载图片

Glide.with(context).load(internetUrl).into(targetImageView);

从文件加载

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"Test.jpg");
Glide.with(context).load(file).into(imageViewFile);

从资源id

int resourceId = R.mipmap.ic_launcher;
Glide.with(context).load(resourceId).into(imageViewResource);

从uri

Glide.with(context).load(uri).into(imageViewUri);

加载gif

String gifUrl = "xxxxx";
Glide.with( context ).load( gifUrl ).into( imageViewGif );

一些常规方法(待加载时显示,加载出错时显示)

Glide.with( context ).load( gifUrl ).placeholder( R.drawable.cupcake ).error( R.drawable.full_cake ).into( imageViewGif );

强制转化为gif

Glide.with( context ).load( gifUrl ).asGif().error( R.drawable.full_cake ).into( imageViewGif );

用bitMap播放Gif

Glide.with( context ).load( gifUrl ).asBitmap().into( imageViewGifAsBitmap );

播放本地mp4,只能是本地

String filePath = "/storage/emulated/0/Pictures/example_video.mp4";
Glide.with( context ).load( Uri.fromFile( **new **File( filePath ) ) ).into( imageViewGifAsBitmap );

加载流程总结如下:

1)首先,Glide.with(activity)方法得到RequestManager类,这个类的主要作用是将glide 与 整个组件的生命周期绑定在一起。(它实现了LifecycleListener接口,这是一个与Context的生命周期绑定的接口,将request与生命周期绑定,这样就可以通过context的生命周期去操作网络请求的开始,暂停等。)

如何绑定的??答:在Activity上创建一个透明无界面的RequestManagerFragment加入到FragmentManger中,通过添加的Fragment来感知Activity、Fragment的生命周期。因为添加到Activity中的Fragment会跟随Activity的生命周期。

2)通过load方法来初始化一些参数,这里传入的参数给后面的加载方式提供了依据;

3)通过into这个核心方法将图片获取 并 通过一系列处理后加载到相应的控件上,这部分逻辑最为复杂,建立请求,然后通过Engine引擎类将请求进行统一的处理,里面开启了两个线程池-----------磁盘缓存线程池(diskcacheService)和 源线程池(sourceService),并且进行了两层缓存,除了我们常见的内存缓存外,还进行了活动资源的缓存,其中内部的网络请求是通过android原生的HttpUrlConnection完成的。

Gilde的优点
1、图片占用内存回收及时,能减少因内存不足造成的崩溃,生命周期和Activity/Fragment一致。 (重要的特性)
2、默认Bitmap格式是RGB_565,减少内存资源占用。
3、glide比universal-image-loader占用的内存要小一些。
4、图片显示效果为渐变,更加平滑。
5、glide可以将任何的本地视频解码成一张静态图片。
6、支持 Gif、WebP、缩略图

Glide优点详细>>

Glide的缓存

用过手机的都知道,当划上划下一个ListView的时候,第二次都比第一次快,就是因为为GlideView对资源进行了缓存,而且封装的很好,甚至不需要自己去设定缓存大小,Glide会智能地自己给我们根据设备设置缓存大小。

placeHolder

听名字都知道这家伙是干嘛的,加载图片,但是图片还没有加载完的时候,总不能给用户看空白吧,这个就是用来填充着一段是时间的。

Glide.with(context).
        load(UsageExampleListViewAdapter.eatFoodyImages[0])
            .placeholder(R.mipmap.ic_launcher) *// 同样也可以是drawble
            .into(imageViewPlaceholder);

关于缓存

要想性能好,怎可以不用缓存。缓存就是为了减少或者杜绝多的网络请求。为了避免缓存,Glide用了内存缓存和‘外存缓存机制’,并且 提供了相应的方法,完全封装,不需要处理细节。Glide会自动缓存到内存,除非调用. skipMemoryCache( true )。尽管调用了这个,Glide还是会缓存到外存,还有一种情形,就是有一张图片,但是这张图变化非常快,这个时候可能并不想缓存到外存中,就使用.diskCacheStrategy( DiskCacheStrategy.NONE )。如果你两种都不需要,可以两个方法组合着一起使用。

请求优先级.request()

加载图片肯定也是有先后顺序,Glide提供了.request()这个方法,它接收以下几个参数:

  • Priority.LOW
  • Priority.NORMAL
  • Priority.HIGH
  • Priority.IMMEDIATE
    但是Glide并不一定会按照你的顺序来,只是尽量按照你的顺序来。(比如给一张很大的图片最高的优先权,但是它并不一定比低优先级的图先加载出来,这个时候只有使用缩略图了)

自定义外存缓存机制

Glide默认会缓存Image的很多个版本,比如原图,如果你的imageView大小的缓存。.diskCacheStrategy( )有以下几种缓存策略:

  • DiskCacheStrategy.NONE 什么都不缓存
  • DiskCacheStrategy.SOURCE 只缓存最高解析图的image
  • DiskCacheStrategy.RESULT 缓存最后一次那个image,比如有可能你对image做了转化
  • DiskCacheStrategy.ALL image的所有版本都会缓存
Glide
.with( context ).load( image )
.diskCacheStrategy( DiskCacheStrategy.SOURCE )
.into( imageViewFile );


查看更多>>>
来源(转自):简书 作者:lxacoder  链接:https://www.jianshu.com/p/c9efd313e79e
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Glide原理好文章

 

你可能感兴趣的:(android,java)