Glide的学习之路

一、基础的使用

  Glide.with(getApplicationContext())
  .load("11") //加载指定的url的图片
  .placeholder(1) //指定图片未成功加载前显示的图片
  .error(1) //指定加载失败显示的图片
  .override(1,1) //指定图片的尺寸
  .fitCenter() //指定图片缩放类型
  .centerCrop() //指定图片缩放类型
  .skipMemoryCache(true) //跳过内存缓存
  .diskCacheStrategy(DiskCacheStrategy.NONE) //跳过磁盘缓存
  .diskCacheStrategy(DiskCacheStrategy.RESOURCE) //仅仅只缓存原来的全分辨率的图像
  .diskCacheStrategy(DiskCacheStrategy.ALL) //缓存所有的版本的图像
  .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC) //
  .diskCacheStrategy(DiskCacheStrategy.DATA) //缓存原始图片
  .priority()
  .into() //指定的控件

https://www.jianshu.com/p/e46b42bfeef5  ------>基础学习 

https://www.cnblogs.com/jiutiankunpeng/p/6067909.html

http://blog.sina.com.cn/s/blog_63cf94a90102w3p0.html

 

二、Glide的优点

  1.使用简单

  2.占用内存小(默认是RGB_565)

  3.缓存优化

   a.支持内存分级缓存 : 正在使用图片,弱引用缓存 , 已使用过的图片LruCache缓存

     b. Glide会为不用的ImageView尺寸缓存不同尺寸的图片

    4. 与Activity的生命周期绑定,不会出现内存泄漏

 

三、生命周期绑定的原理 : Glide通过生成无UI的Fragment来绑定Activity的生命周期

  实现原理 : 通过调用with方法会调用RequestManagerRetriever的对象,然后去调用它的get(可以传不同的类型:Activity、Context、Fragment)来获得RequestManager对象(这里面有对是否在主线程isOnMainThread并且是Context对象做判断处理)最终都会返回一个RequestManager对象(可以监听整个组件的生命周期), 里面会调用getRequestManagerFragment.get()方法可以获取一个空的Fragment。RequestManagerFragment又继承Fragment,里面有个ActivityFragmentLifecycle这样的回调接口的对象来给RequestManagerFragment进行监听Activity的生命周期,接着还调用setRequestManager()方法,是将空的fragment和RequestManager进行绑定,从而可以达到RequestManager可以监听组件的生命周期监听

  

四、缓存原理
  1.缓存模式

    .diskCacheStrategy(DiskCacheStrategy.NONE)               //跳过磁盘缓存
    .diskCacheStrategy(DiskCacheStrategy.RESOURCE)    //仅仅只缓存原始图片
    .diskCacheStrategy(DiskCacheStrategy.ALL)                 //缓存所有的图片
    .diskCacheStrategy(DiskCacheStrategy.DATA)             //缓存使用过的图片

  2. 内存缓存 : 正在使用的采取弱引用缓存,使用完的采取LruCache缓存

  3.内存缓存实现的机制

   里面有个叫做loadFromCache(代表已经使用的图片 数据类型是LinkHashMap作为存储)和loadFromActiveResource(代表当前正在使用的图片,数据类型是HashMap弱引用作为存储)都会传入一个EngineKey这个参数,它是由图片的宽、高、url等图片属性组成的,

   4.LRU的算法 :  内部使用LinkedHashMap作为缓存, get和put完成添加和获取的操作,HashMap的remove方法来移除对象,里面有个计数变量,当计数变量为0的时候,就会把该对象移除。当内部缓存满的时候,会调用trimToSize把较早或者使用最少的缓存对象移除出去,添加新的对象。

  5. 三级缓存 :   网络->本地->内存

  6.磁盘缓存 : 也是使用LRU的算法

 

 

 

  

      

 

 

二、bitmap的数据讲解

  1.为什么Bitmap会导致OOM(如何解决)

`   a.ListView 做法 : 当你做滑动时候时候,切莫加载图片,待滑动停止时候再加载图片,可以防止OOM

   b.Bitmap占用内存 = 图片长度*图片宽度*一个像素点所占的字节数

    例子: 一个图片(RGB888)

   c.VM值上限dalvik.heapgrowthlimit 限定每个应用限定的最大内存

  2.Bitmap的四种优化策略

   a.对图片质量进行压缩        compress()方法

   b.对图片按比例进行压缩

   c.关于bitmap的recycle方法  一般不会主动调用,一旦调用他的bitmap对象一定设置为null,否则会有内存泄漏问题

   d.捕获异常                 OutOfMemoryError  e  : 对内存溢出进行捕获,不会出现奔溃

 

三、三级缓存和lrucache算法

  1.三级缓存的步骤 : 内存-本地-网络 

  2.内存缓存的实现 :  缓存策略主要是添加、获取、删除这三步,如果缓存内存已经满了,需要清除一些缓存,这个时候就有LRU缓存算法出现 

            LRU算法采用LinkHashMap的顺序来实现缓存,每次先调用get的方法移动到对象的尾端,然后再调用put方法插入新的对象放在对象的尾端

            当缓存到达最大值时,将链表头的对象移除

 

https://blog.csdn.net/guolin_blog/article/list/2? 参考这篇文章学习

posted on 2019-09-01 11:58  zhang11111wei  阅读(310)  评论(0编辑  收藏  举报

导航