安卓网络数据缓存策略

版权声明:本文为 宇不语 原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35064774/article/details/53449779

如有转载,请申明:
转载至 http://blog.csdn.net/qq_35064774/article/details/53449779

前言

对于大部分 App 来说,网络请求都是必不可少的,而且不少App是以数据为主。如果不做数据缓存,在网络慢的情况下,会降低用户体验度。

仿佛有一段时间没写博客了,吓得我都祭出了神图。

Json/Xml数据缓存策略

对于文本类数据,同一个地址的请求结果一般是会随着时间而变化的,所以需要根据应用的需求来做缓存。

  1. 数据实时性高
    常见的此类应用:新闻、朋友圈、股票、社区等。
    无论是否存在缓存,都应该去请求网络,缓存只是充当了一个“默认数据”的角色。也就是先显示缓存数据,然后请求网络,显示最新的数据。

    伪代码如下:

    如果 (存在缓存) {
        读取缓存并显示
    }
    请求网络
    写入缓存
    显示网络数据

    流程很简单,但其中存在很多细节。比如,如果缓存可用,请求网络的时候,不应该显示正在加载的界面,网络请求失败的时候,也不应该显示错误界面。
    每个数据请求,都包含大量的逻辑判断和分支,你完全可以这样实现,但这样的代码不够优雅,在下一篇文章 RxJava2.0在安卓中的二级缓存策略 我将会介绍用 RxJava2.0 实现此类数据缓存。

  2. 数据定期更新或不频繁变化
    常见的此类应用:应用市场、小说、定期更新的干货类
    这类应用,根据情况,对缓存的数据设置一个过期时间,只要时间未过期,就优先使用缓存,当缓存过期后,优先使用网络。

    伪代码如果:

    如果 (存在缓存 且 缓存未过期) {
        读取缓存并显示
        返回
    }
    请求网络
    更新缓存
    显示最新数据

    这类应用逻辑就更简单,要么显示缓存数据,要么请求网络。同样,下一篇文章我会介绍 RxJava2.0 的实现方式。

  3. 没网无法使用类型
    常见的此类应用:外卖类、购物类、打车类、金融类等。
    这类应用离开了网络,就不能正常使用了,所以你可以选择不做缓存。

图片缓存策略

对于图片来说,基本是地址确定了,内容就不会变化。所以可以放心的持久化存储而不用担心过期。
但图片比较特殊,它占用的内存较大,即使是本地的图片,也可能有较大的加载延迟。这个时候,网络+本地的缓存策略已经不够用了。
聪明的同学已经想到了,网络+本地+内存的三级缓存策略。优先读取内存数据,其实是本地数据,最后是网络数据。
但这其中也有很多细节需要注意。

  1. 内存不足
    如果把所有图片全部缓存到内存,用不了多久就会出现 OOM。
    所以,只能部分缓存到内存。这时候,内存缓存的主要问题就变成选择缓存图片的问题了。
    常用的选择策略是,LRU策略,也就是近期最少使用的算法,当内存不足时,优先删除近期最少使用的图片。

  2. 占用存储过多
    和内存一样的道理,即便是本地存储,也不可能无限制的存储。我们一般会为本地缓存划分一个最大存储容量,这个容量可以手动指定,也可以根据当前设备的容量来计算。当本地缓存满时,优先清除最老的数据。

看到这里你可能觉得图片缓存太过麻烦了,确实是这样的,不过幸好,有很多优秀的第三方开源库已经完美的解决了这些问题,比如 glide

猜你喜欢

转载自blog.csdn.net/qq_35064774/article/details/53449779