zoukankan      html  css  js  c++  java
  • Android实战——RxJava2解锁图片三级缓存框架


    本篇文章包括以下内容

    • 前言
    • 图片三级缓存的介绍
    • 框架结构目录的介绍
    • 构建项目整体框架
    • 实现图片三级缓存
    • 演示效果
    • 源码下载
    • 结语

    RxJava2作为如今那么主流的技术,不学习学习都不行了,本篇文章需要你有RxJava2的基础,如果需要对RxJava2学习的同学,可以关注我的博客,查看Android实战——RxJava2+Retrofit+RxBinding解锁各种新姿势 。项目代码实现模仿Picasso,大伙们可以看下最后的代码效果,那么废话不多说,Hensen老师开车啦

    图片的三级缓存很多同学可能已经掌握了,很多同学可能也听说过,那么这里就简单的来回顾一下你们学习的三级缓存机制是否正确吧

    这里写图片描述

    首先,这个图就是表示三级缓存机制的所有,其三级分别是(按先后顺序)

    1. 内存缓存(一级):如果内存存在我们的缓存信息,直接用它
    2. 文件缓存(二级):如果内存不存在我们的缓存信息,那么就查看是否有我们的缓存文件,如果有,直接使用它。同时,将其缓存到内存中
    3. 网络缓存(三级):如果文件不存在缓存文件,直接从网络上下载,直接使用它。同时,将其缓存到文件和内存中

    那么我们在框架中我们需要做的事情有哪些呢?

    1. 内存缓存:采用Google自带的LruCache进行缓存
    2. 文件缓存:采用Github上没有被Google收录却被Google认证的DiskLruCache
    3. 网络缓存:通过io流的Stream进行文件的读写

    如果对于LruCache和DiskCache不懂的同学,可以查看郭霖大神的博客,里面有很详细的讲解,Lru指的是近期最少使用算法

    框架的结构看似复杂,其实内容不多,实现起来也不难

    这里写图片描述

    下面对框架结构目录进行介绍,图片上显示了目录结构之间的关系

    这里写图片描述

    1. TextImageLoaderActivity:是我们的测试界面
    2. ImageBean:使用RxJava的onNext传递的Bean对象
    3. CacheObservable:三级缓存的父类
    4. DiskCacheObservable:文件缓存Observable
    5. MemoryCacheObservable:内存缓存Observable
    6. NetworkCacheObservable:网络缓存Observable
    7. RequestCreator:对三级缓存进行统一管理
    8. RxImageLoader:使用RequestCreator管理类进行缓存机制的调用
    9. DiskCacheUtils:文件缓存的工具类

    1、准备工作

    导入我们需要的依赖库

    2、Bean对象的创建

    我们以key、value的形式来创建该Bean对象

    3、缓存类的创建

    这里我们的三级缓存只要继承至该类,实现存入缓存和取出缓存的操作就可以了

    这里也是我们最后一步所要实现的逻辑功能,这里我们先把框框搭建好

    4、管理缓存类创建

    5、模拟Picasso源码,使用构造者模式创建我们的RxImageLoader

    上面代码做了哪些事

    1. 采用双判空的单例模式
    2. 可采用链式编程方式
    3. 使用RxJava的concat和first方法
    4. concat方法表示将缓存机制Observable进行有序的连接,按顺序读取内存缓存,文件缓存,网络缓存
    5. first方法表示判断,如果IamgeBean中的bitmap为空,那么跳过此次连接,例如,requestCreator.getImageFromMemory(mUrl)获取的bitmap为空,那么直接跳过这次concat连接,进行requestCreator.getImageFromDisk(mUrl)操作,直到bitmap不为空则程序继续往下执行,断开concat的连接

    6、Activity加载图片

    我们简单的使用一个按钮加载图片就好了

    做好了框架的框框,下面就是对具体的DiskCacheObservable、MemoryCacheObservable、NetworkCacheObservable进行对应的方法实现就可以了

    1、内存缓存

    内存缓存最简单了,只要放入到LruCache即可

    2、文件缓存

    文件缓存涉及DiskLruCache的使用、文件下载和文件名用MD5加密

    这里用到一个DiskLruCacheUtils

    3、网络缓存

    网络缓存只需要下载文件,不需要实现缓存数据的方法即可

    4、管理缓存

    获取三级缓存逻辑实现完之后,就应该对管理我们的缓存,进行对应的缓存操作

    1、首次运行程序,没有任何缓存,当我们连续点击2次按钮时

    这里写图片描述

    可以看到其运行的顺序

    1. 第一次点击按钮可以先从内存和文件获取图片,中老年服饰发现没有,再从网络获取图片
    2. 第二次点击按钮从内存获取

    2、第二次运行程序,有了文件缓存,当我们连续点击2次按钮时

    这里写图片描述

    可以看到其运行的顺序

    1. 第一次点击按钮先从内存获取,发现没有,再从文件获取图片
    2. 第二次点击按钮从内存获取

    源码下载

    各位同学可以下载源码进行阅读,最好自己手写一遍,你会更深刻体会到RxJava的好处和掌握图片的三级缓存机制,如果看不懂的同学不要气馁,多看几遍就会了。喜欢我的朋友可以关注我的博客,一定会有你想要学习的知识

  • 相关阅读:
    原生js 异步请求,responseXML解析
    asp.net中Page.ClientScript.RegisterStartupScript用法小结
    asp.net 在repeater控件中加按钮
    无法打开物理文件 操作系统错误 5:拒绝访问 SQL Sever
    js 注册控件的onclick事件
    js控件设置只读属性和不可用属性
    js CheckBox只读
    js时间日期格式
    js正则判断日期
    UIPickerView的使用(三)
  • 原文地址:https://www.cnblogs.com/zhanglixina/p/9603749.html
Copyright © 2011-2022 走看看