• 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? 参考这篇文章学习

  • 相关阅读:
    mysql 数据库之存储过程语法
    数据库之多表查询
    mysql 查询之数据语句分类
    mysql 之分组查询
    mysql之查询排序
    mysql 之分页查询
    简述Hibernate常见优化策略
    如何理解Hibernate的延迟加载机制?
    hibernate中Session的load和get方法的区别是什么?
    HttpServlet容器响应Web客户请求流程?
  • 原文地址:https://www.cnblogs.com/liunx1109/p/11441888.html
Copyright © 2020-2023  润新知