今天讲解下图片缓存框架的解析与设计,在学习面向对象的任何框架之前,你要做的一件事情就是熟悉设计模式,废话不多说,直接进入主题,。

1.首先看一幅图,这幅图很清晰的告诉你,缓存框架要做哪些事情:

2 .下面这张图主要是为了反映这些模块是如何联系在一起的  (该图是缓存中都没有对应图片的时序图形)。

3 .下面是各个模块的实现细节

一、缓存模块设计

(1)运用模式  模板方法模式+装饰模式+享元模式(模式定义可参考其他资料)。

(2)整体类图

(3).关键实现部分详解

缓存框架上大体有两类实现

1.单纯弱引用:

WeakMemoryCache只实现抽象类中createReference()方法创建缓存对象,保存在非强引用的softMap享元池中,这种方式只要垃圾回收机制扫描到即被回收。

2.弱引用+强引用:(这种方式优势,即使是强引用享元池中的元素被移除,弱引用中的对象仍然可能被使用)

这种方式有三个享元池,三个池中存的Bitmap都是同一个对象,因此不用担心有浪费内存的行为,这里来分别讲下这三种池的作用:

BaseMemoryCache类中的非强引用softMap: 在强引用remove对象的时候,该池中内容可以无需被remove,由垃圾回收机制来处理。

LimitedMemoryCache类中的强引用hardCache享元池: 强引用享元池保证该对象不被垃圾回收机制回收,达到用户可以控制的目的。

以及具体实现类的享元池(FIFOLimitedMemoryCache、、): 用于实现各种策略的集合。

LRULimitedMemoryCache:  采用LinkedHashMap来实现最近最久未使用策略。

LinkedHashMap特点: LinkedHashMap重写了父类HashMap的get方法,实际在调用父类getEntry()方法取得查找的元素后,再判断当排序模式accessOrder为true时,记录访问顺序,将最新访问的元素添加到双向链表的表头,这样我们做移除操作时,移除遍历到的第一个元素即可,从而达到最近最久最使用的出列,并且将父类LimitedMemoryCache中的hardCache对应的对象移除。

LargestLimitedMemoryCache: 采用HashMap集合,当map中的大小超过规定大大小,即移除集合中最大的一个元素。HashMap中的value存放该图片的大小,key存放Bitmap对象,当hardCache大小大于规定大小的时候,遍历HashMap将value最大的移除。并且将父类LimitedMemoryCache中的hardCache对应的对象移除。

FIFOLimitedMemoryCache: 采用LinkedList集合List中的大小超过规定的大小,利用LinkedList自带的remove(0)方法来移除集合中的第一个元素。

UsingFreqLimitedMemoryCache: 采用HashMap集合当map中的大小超过规定带下,即移除集合中使用频率最小的一个元素,HashMap中的value存放该图片使用次数,key存放Bitmap对象。

注意:FuzzyKeyMemoryCache实现了接口所有方法,对传过来的缓存具体对象进行装饰,在对象被put的时候,增加一些其他移除规则。

比如图片的下载地址相同,但是需要的尺寸不同(保存缓存KEY的时候是要带上图片目标尺寸的),这个时候如果有新的图片存入缓存池就需要区分缓存对象中尺寸是否是用户当前想要的尺寸,不是则需要移除之前的BitMap对象。

二、显示包装模块

模式:类似中介者模式,将要处理的图片与ImageView传给中介者display,由中介者对图片进行处理后将图片与ImageView关联起来,对于外面来说无需关注其实如何关联在一起的。

图片在显示之前进行一些处理,比如圆角,淡入淡出、毛玻璃包装,用户可以自定义包装类。

三、图片获取模块

图片可以从其他应用中(相册)、手机中SD卡中、资源文件drawable、网络上(http、https)、assets等地方获取.

其他应用中获取(相册):ContentResolver

手机中获取:FileInputStream

assets:  context.getAssets().open(filePath);

资源文件drawable:context.getResources().openRawResource(drawableId);

网络上(http、https):HttpURLConnection、httpClient

四、配置模块设计

初始配置项繁多,config对象构造复杂,因此整体采用建造者模式。

五、客户端监听模块

采用模式 观察者模式。由监听者由调用方传过来,当以下事件发发生时,即回调客户端。

1.开始下载LoadingStart

2.下载失败LoadingFailed

3.下载完成onLoadingComplete

4.下载取消onLoadingCancelled

六、其他优化措施:

在LISTVIEW,GrildView滚动过程中停止加载:

继承 OnScrollListener类,重写onScrollStateChanged方法,

OnScrollListener.SCROLL_STATE_IDLE时继续图片加载。

OnScrollListener.SCROLL_STATE_TOUCH_SCROLL,OnScrollListener.SCROLL_STATE_FLING时暂停图片加载。

图片缓存框架解析与设计相关推荐

  1. Android图片缓存框架Glide

    Android图片缓存框架Glide Glide是Google提供的一个组件.它具有获取.解码和展示视频剧照.图片.动画等功能.它提供了灵活的API,帮助开发者将Glide应用在几乎任何网络协议栈中. ...

  2. glide等图片缓存框架替换缓存图片解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 应用场景: 手机app 用户的头像地址 在服务器上是固定的,比如有些服务器喜欢以 用户手机或者用户id 作为唯一标识,那么用户 ...

  3. 手写图片缓存框架 ImageLoader

    图片缓存是App开发中最常见的,本篇博文给大家带来自己手写的图片缓存框,大致的思路很简单,首先从内存中获取图片,如果内存中没有,就从手机本地进行获取,如果还没有,就从网络访问进行获取. 所以,我们在I ...

  4. Android三级图片缓存框架思路【附练习Demo】

    缓存的简介 现在android应用中不可避免的要使用图片,有些图片是可以变化的,需要每次启动时从网络拉取,这种场景在有广告位的应用以及纯图片应用(比如百度美拍)中比较多.
        现在有一个问 ...

  5. SpringBoot2.x 官方推荐缓存框架-Caffeine高性能设计剖析

    概要 Caffeine是一个高性能,高命中率,低内存占用,near optimal 的本地缓存,简单来说它是Guava Cache的优化加强版,有些文章把Caffeine称为"新一代的缓存& ...

  6. Android图片缓存框架 - Fresco的GenericDraweeHierarchy (五)

    目录 1.Fresco 简介 2. Fresco 文档 3. Fresco开发步骤 4. Fresco加载图片6种方式 5. Drawees xm属性设置 6 Fresco实现圆角或圆形图片 7. D ...

  7. Android图片缓存框架 - Fresco实现圆角或圆形图片 (四)

    目录 1.Fresco 简介 2. Fresco 文档 3. Fresco开发步骤 4. Fresco加载图片6种方式 5. Drawees xm属性设置 6 Fresco实现圆角或圆形图片 6.1 ...

  8. Android图片缓存框架 - Glide自定义圆角 (五)

    目录 1. Glide API 2. Glide导入包 3. Glide 7种加载图片方式 4. 取消加载 5 Glide加载GIF 6. Glide的RequestOption 7. Glide自定 ...

  9. Android 开源项目android-open-project工具库解析之(一) 依赖注入,图片缓存,网络相关,数据库orm工具包,Android公共库...

    一.依赖注入DI 通过依赖注入降低View.服务.资源简化初始化.事件绑定等反复繁琐工作 AndroidAnnotations(Code Diet) android高速开发框架 项目地址:https: ...

最新文章

  1. Python-Numpy(3)矩阵基本操作
  2. java后期发展方向_2020年前3季度工程自卸车市场咋样?后期朝啥方向发展?
  3. ubuntu19.04更改国内镜像源
  4. GDCM:gdcm::StrictScanner的测试程序
  5. AI助力新药研发 腾讯发布「云深智药」平台
  6. 今日计划:修改Plog,为期2天
  7. 机器学习—LightGBM的原理、优化以及优缺点
  8. 【协同任务】基于matlab蚁群算法多组群UAV协同任务路径规划【含Matlab源码 1578期】
  9. java静态声明调用_求问 static声明的方法不是只能调用静态属性或者方法吗?
  10. adb官方最新下载链接和常用操作
  11. 前端vue实现PDF预览
  12. N阶Butterworth滤波器的频率响应(Python实现)
  13. Python爬虫实战(2)之爬取NBA球队各个球员头像图片
  14. Centos 7分辨率调整成适应虚拟机屏幕大小
  15. android fragmentpageradapter切换不更新,android – FragmentPagerAdapter不会在方向更改时重新创建片段吗?...
  16. 基于混沌系统的文本加密算法研究(二)——经典混沌映射
  17. 阿里云服务器esc第一弹,新手教程,过程详细哦
  18. ThinkPad E460c安装触摸板驱动未找到未发现synaptics设备
  19. load json文件时常见错误以及修正总结(亲测有效)
  20. 叶飘落,诉说着冷寂与孤独

热门文章

  1. 高端笔记本电脑轻薄本推荐之XPS 13
  2. Helm Hook钩子详述
  3. 良心推荐!!!!最适合中等配置笔记本使用的系统:win10企业版2016长期服务版,系统纯净好用无冗余程序,无需软件或密钥就可完美激活!
  4. MySQL学习总结_φ(❐_❐✧
  5. MacOS 微软办公套件 Microsoft Office
  6. 【AI_数学知识】数学分析
  7. 第十二届全国大学生数学竞赛非数类试题
  8. 学习笔记|数据挖掘中的数据
  9. 怎么不用安装光盘修复计算机,不用u盘和光盘装win7如何解决?
  10. 工作一年,突然有新的感悟