【免费下载链接】XSnow
💮基于RxJava2+Retrofit2精心打造的Android基础框架,包含网络、上传、下载、缓存、事件总线、权限管理、数据库、图片加载,基本都是项目中必用功能,每个模块充分解耦,可自由拓展。
XSnow 是基于 RxJava2 + Retrofit2 打造的 Android 基础框架,其网络模块内置了 5 种可自由切换的缓存策略(CacheMode)。只需一行配置,即可让接口数据"秒开"、断网可用,轻松提升 App 加载体验。
为什么缓存策略如此重要?
对于列表页、首页数据这类接口,用户最直观的感受就是"快"和"稳":
- ⚡快:命中本地缓存时,数据直接从磁盘读取,无需等待网络往返,首屏打开近乎瞬时。
- 📡稳:弱网甚至断网环境下,依然能展示上次成功获取的数据,告别白屏。
- 🔁省:减少重复网络请求,降低流量消耗与服务器压力。
XSnow 的缓存能力分为两层:
| 层级 | 能力 | 适用场景 |
|---|---|---|
| 本地数据缓存 | 针对接口 JSON 数据的缓存,支持 5 种缓存策略、可配置缓存 Key 与过期时间 | 首页数据、详情信息等 JSON 接口 |
| HTTP 缓存 | OkHttp 协议级缓存,支持在线/离线拦截器 | 静态资源、图片等支持 Cache-Control 的请求 |
本文重点讲解应用最广的5 种本地缓存策略。
5 种缓存策略一览:总览表先收藏
XSnow 通过 CacheMode.java 枚举定义了 5 种模式,每种模式在 strategy 包下都有对应的策略实现类:
| 缓存模式 | 策略类 | 行为说明 | 典型场景 |
|---|---|---|---|
FIRST_REMOTE | 优先网络 | 先请求网络,失败后回退加载缓存 | 新闻列表等强实时数据 |
FIRST_CACHE | 优先缓存 | 先读缓存,缓存不存在再请求网络 | 启动页配置、个人中心信息 |
ONLY_REMOTE | 只取网络 | 仅请求网络,但返回数据仍会写入缓存 | 实时价格、登录态数据 |
ONLY_CACHE | 只取缓存 | 仅读取本地缓存,不发网络请求 | 断网兜底展示历史数据 |
CACHE_AND_REMOTE | 缓存+网络 | 先回调缓存,再回调网络,会回调两次 | 先出旧数据、再用新数据刷新 |
💡 五种策略统一继承自抽象基类 CacheStrategy.java,内部封装了
loadCache(读缓存)与loadRemote(请求网络并回写缓存)两个核心能力,你只需切换模式即可,无需关心实现细节。
如何开启 XSnow 缓存?3 行代码搞定
XSnow 采用链式 API,开启本地缓存非常简单。以示例工程 NetTestActivity.java 为例:
ViseHttp.GET("getAuthor") .tag("request_get_2") .setLocalCache(true) // ① 开启本地缓存 .cacheMode(CacheMode.FIRST_CACHE) // ② 指定缓存策略 .request(new ACallback<CacheResult<AuthorModel>>() { ... });三步关键点:
.setLocalCache(true):声明该请求启用本地缓存,相关开关定义在 BaseHttpRequest.java 中。.cacheMode(...):指定 5 种缓存策略之一,决定数据优先从缓存还是网络获取。- 回调类型换成
CacheResult<T>:这是 XSnow 专为缓存设计的包装类,见 CacheResult.java。
用 CacheResult 区分数据来源
拿到数据后,可以通过cacheResult.isCache()判断本次数据是来自缓存还是网络,方便在界面上给用户不同的提示(如显示"数据来自本地"):
if (cacheResult.isCache()) { // 数据来自本地缓存 } else { // 数据来自网络请求 }进阶配置:缓存 Key 与过期时间
默认情况下,缓存以 Host 为 Key、永不过期(ViseConfig.java 中CACHE_NEVER_EXPIRE = -1)。你也可以按需定制:
ViseHttp.GET("getAuthor") .setLocalCache(true) .cacheKey("my_page") // 自定义缓存 Key .cacheTime(30 * 60 * 1000) // 缓存 30 分钟后过期 .cacheMode(CacheMode.FIRST_REMOTE) .request(callback);- cacheKey:不同页面建议使用不同的 Key,避免数据互相覆盖。
- cacheTime:单位为毫秒,超过该时间的缓存会被视为过期,重新请求网络。
场景化选型指南:5 种策略怎么选?
不知道选哪个策略?按下面的场景对照即可 ✅
1️⃣ 首页/列表:优先网络(FIRST_REMOTE)
数据实时性要求高(新闻、动态流)。正常情况走网络,断网时自动回退展示上次缓存。
.cacheMode(CacheMode.FIRST_REMOTE)其实现 FirstRemoteStrategy.java 会先执行网络请求,网络失败后再按顺序尝试读取缓存,并只返回第一个有效结果。
2️⃣ 启动页/配置信息:优先缓存(FIRST_CACHE)
用户最关注"打开速度",实时性要求一般。缓存存在则直接用,不存在才走网络。
.cacheMode(CacheMode.FIRST_CACHE)3️⃣ 实时性数据:只取网络(ONLY_REMOTE)
股价、库存、未读数等必须最新的数据。虽然不走缓存读取,但返回的数据依然会被写入缓存,为日后切换策略或离线兜底做储备。
4️⃣ 断网兜底:只取缓存(ONLY_CACHE)
完全不发请求,直接读磁盘。适合"历史浏览记录"、离线模式等场景。注意:如果缓存不存在,会收不到有效数据。
5️⃣ 旧数据先行 + 新数据刷新:CACHE_AND_REMOTE
体验最优的模式:界面先渲染缓存的旧数据,网络数据到达后再刷新一次。会回调两次onSuccess(第一次isCache() == true,第二次为false)。
.cacheMode(CacheMode.CACHE_AND_REMOTE)其实现 CacheAndRemoteStrategy.java 按"缓存 → 网络"的顺序串联输出,两个结果都会回调,非常适合信息流"秒开 + 刷新"的体验。
缓存管理:清除与自定义磁盘缓存
当用户切换账号或需要强制刷新时,XSnow 提供了便捷的缓存管理 API(定义在 ViseHttp.java):
ViseHttp.removeCache("my_page"); // 清除指定 Key 的缓存 ViseHttp.clearCache(); // 清除全部缓存此外,本地缓存底层由 ApiCache.java 的 Builder 构建,支持自定义磁盘缓存目录与容量上限,满足对存储空间有要求的场景。
常见问题 FAQ
Q1:开启缓存后,所有接口都会缓存吗?不会。只有显式调用.setLocalCache(true)的请求才启用本地缓存策略,其他请求行为不变。
Q2:HTTP 缓存和这 5 种策略是一回事吗?不是。HTTP 缓存(setHttpCache)是 OkHttp 协议级缓存,作用于原始响应;5 种缓存策略是 XSnow 针对接口 JSON 数据做的应用层缓存,二者可独立或叠加使用。
Q3:CACHE_AND_REMOTE 回调两次,UI 会闪吗?不会闪屏,反而这正是它的价值:先用旧数据填充界面,再用新数据平滑刷新。注意在回调里区分isCache(),避免重复逻辑。
Q4:缓存会一直占用磁盘吗?可通过.cacheTime()设置过期时间控制生命周期,配合clearCache()主动清理;也可通过 ApiCache Builder 限制磁盘目录与最大容量。
总结
XSnow 用一行.cacheMode(...)配置就让你获得了专业级的数据缓存能力:
| 你的需求 | 推荐策略 |
|---|---|
| 实时数据 + 断网兜底 | FIRST_REMOTE |
| 打开速度优先 | FIRST_CACHE |
| 强实时、不读缓存 | ONLY_REMOTE |
| 纯离线展示 | ONLY_CACHE |
| 旧数据秒开 + 新数据刷新 | CACHE_AND_REMOTE |
建议从FIRST_REMOTE+cacheTime组合起步,再根据页面特性逐步调优。掌握这 5 种缓存策略,你的 App 数据加载速度就能快人一步 🚀
【免费下载链接】XSnow
💮基于RxJava2+Retrofit2精心打造的Android基础框架,包含网络、上传、下载、缓存、事件总线、权限管理、数据库、图片加载,基本都是项目中必用功能,每个模块充分解耦,可自由拓展。
相关推荐
cal.com缓存策略:Redis缓存与数据预加载优化
cal.com缓存策略:Redis缓存与数据预加载优化 你是否在使用cal.com时遇到过页面加载缓慢、数据刷新延迟的问题?作为一款开源日历应用,cal.com
后端前端企业应用Sylius缓存预热策略:如何在部署时预加载关键缓存数据
Sylius缓存预热策略:如何在部署时预加载关键缓存数据 部署电子商务平台时,缓存预热是提升性能的关键步骤。Sylius作为基于Symfony的开源电商框架,提
电商后端API网关toBeBetterJavaer缓存预热:Redis数据加载策略
toBeBetterJavaer缓存预热:Redis数据加载策略 1. 缓存预热的价值与挑战 缓存预热(Cache Preloading)是系统启动时主动将热点
文档教程知识库技术博客后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考