Android网络缓存

简介:

主要介绍可同步或异步获取数据、可自动根据服务器的返回头判断是否需要缓存、可自动根据请求头信息判断是否读取缓存的网络缓存
本文分为四部分包括使用示例、功能介绍、原理介绍、疑问解答。

更多 Android 网络库开源项目可见:Android 网络库

适用:网络获取内容不大的应用,尤其是api接口数据,如新浪微博、twitter的timeline、微信公众账号发送的内容等等。

示例APK可从这些地址下载:Google Play, 360手机助手, 百度手机助手, 小米应用商店, 豌豆荚

示例代码地址见HttpCacheDemo,效果图如下:

1、使用
(1)引入公共库
引入TrineaAndroidCommon@Github(欢迎star和fork^_^)作为你项目的library(如何拉取代码及添加公共库)。

(2)调用
仅需简单两步:

a. 定义缓存

Java

1

private HttpCache httpCache = new HttpCache(context);

或获取全局唯一实例HttpCache

Java

1

private HttpCache httpCache = CacheManager.getHttpCache(context);

b. 调用httpGet函数同步或异步获取网络数据

以httpGet函数异步获取数据为例,其他接口见第2部分介绍

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

httpCache.httpGet("http://www.trinea.cn/", new HttpCacheListener() {

protected void onPreGet() {

// do something like show progressBar before httpGet, runs on the UI thread

}

protected void onPostGet(HttpResponse httpResponse, boolean isInCache) {

// do something like show data after httpGet, runs on the UI thread

if (httpResponse != null) {

// get data success

setText(httpResponse.getResponseBody());

} else {

// get data fail

}

}

});

(3) 要求
缓存过期时间是根据服务器返回头中的cache-control和expires决定的,所以服务器需要设置这两个参数才能生效。具体可见第3部分原理介绍

2、功能介绍
(1) 几个相关类
HttpRequest 请求信息类,可设置超时时间、请求参数、UserAgent、请求属性等
HttpResponse 请求数据返回类,可获取接口内容、过期时间等。
HttpCacheListener 请求回调接口,onPreGet方法会在请求前执行,onPostGet方法会在请求结束后执行,两个方法都运行在UI线程

(2) 构造函数
目前的构造函数仅有一个,后面增加二级缓存可能会添加另外的构造函数
public HttpCache(Context context)

(3) 异步获取网络数据
public void httpGet(String url, HttpCacheListener listener)
根据url获取数据,获取前自动调用listener的onPreGet方法,获取后自动调用listener的onPostGet方法

public void httpGet(HttpRequest request, HttpCacheListener listener)
根据request获取数据,获取前自动调用listener的onPreGet方法,获取后自动调用listener的onPostGet方法

(4) 同步获取网络数据
public String httpGetString(String url)
根据url获取数据,网络错误返回null,否则返回数据为string

public HttpResponse httpGet(String url)
根据url获取数据,网络错误返回null,否则返回数据以HttpResponse.getResponseBody()获取

public HttpResponse httpGetString(HttpRequest httpRequest)
根据request获取数据,网络错误返回null,否则返回数据为string

public HttpResponse httpGet(HttpRequest request)
根据request获取数据,网络错误返回null,否则返回数据为string

(5) 其他
public boolean containsKey(String url) 判断某个url是否已经在缓存中并且有效

public void clear() 清空缓存

3、原理介绍
遵循Http/1.1 rfc2616规范,根据服务器Response Header中的Cache-Control字段的max-age确定缓存时间,如果不存在就取Response Header中的Expires做为缓存过期时间,如示例demo中的

http://www.trinea.cn/test-for-http-cache.html

用chrome查看截图如下:

4、疑问解答
(1) 缓存时间是多少或为什么我的url始终不缓存
缓存时间是根据服务器的返回时间决定的,详见上面第3部分原理介绍

(2) 如果某次请求不想使用缓存数据或返回数据不想被缓存怎么办
a. 某次请求不想使用缓存
在调用httpGet方法时设置入参HttpRequest,如下:
request.setRequestProperty(“cache-control”, “no-cache”);

b. 某次请求返回数据不想被缓存
在调用httpGet方法时设置入参HttpRequest,如下:
request.setRequestProperty(“cache-control”, “no-store”);

目录
相关文章
|
4月前
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
455 1
|
4月前
|
缓存 安全 Android开发
Android经典实战之用Kotlin泛型实现键值对缓存
本文介绍了Kotlin中泛型的基础知识与实际应用。泛型能提升代码的重用性、类型安全及可读性。文中详细解释了泛型的基本语法、泛型函数、泛型约束以及协变和逆变的概念,并通过一个数据缓存系统的实例展示了泛型的强大功能。
46 2
|
2月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
81 15
Android 系统缓存扫描与清理方法分析
|
1月前
|
存储 缓存 Dart
Flutter&鸿蒙next 封装 Dio 网络请求详解:登录身份验证与免登录缓存
本文详细介绍了如何在 Flutter 中使用 Dio 封装网络请求,实现用户登录身份验证及免登录缓存功能。首先在 `pubspec.yaml` 中添加 Dio 和 `shared_preferences` 依赖,然后创建 `NetworkService` 类封装 Dio 的功能,包括请求拦截、响应拦截、Token 存储和登录请求。最后,通过一个登录界面示例展示了如何在实际应用中使用 `NetworkService` 进行身份验证。希望本文能帮助你在 Flutter 中更好地处理网络请求和用户认证。
173 1
|
2月前
|
网络协议 Shell 网络安全
解决两个 Android 模拟器之间无法网络通信的问题
让同一个 PC 上运行的两个 Android 模拟器之间能相互通信,出(qiong)差(ren)的智慧。
34 3
|
3月前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
80 8
|
4月前
|
存储 缓存 监控
警惕网络背后的陷阱:揭秘DNS缓存中毒如何悄然改变你的网络走向
【8月更文挑战第26天】DNS缓存中毒是一种网络攻击,通过篡改DNS服务器缓存,将用户重定向到恶意站点。攻击者利用伪造响应、事务ID猜测及中间人攻击等方式实施。这可能导致隐私泄露和恶意软件传播。防范措施包括使用DNSSEC、限制响应来源、定期清理缓存以及加强监控。了解这些有助于保护网络安全。
122 1
|
4月前
|
存储 Java Spring
Spring Batch:让你的数据洪流化作涓涓细流,批量处理的魔法盛宴!
【8月更文挑战第31天】在现代软件开发中,批量处理对于金融交易、数据仓库加载等数据密集型应用至关重要。Spring Batch作为Spring生态的一部分,提供了一套全面的框架,支持事务管理、错误处理、日志记录等功能,帮助开发者高效构建可靠且可扩展的批处理应用。本文将深入探讨其核心概念、关键特性和实际应用,并通过示例代码展示如何配置作业、步骤及读取器、处理器和写入器,帮助读者更好地理解和应用Spring Batch。
110 0
|
4月前
|
安全 网络安全 Android开发
探索安卓开发之旅:从新手到专家网络安全与信息安全:防范网络威胁,保护数据安全
【8月更文挑战第29天】在这篇技术性文章中,我们将踏上一段激动人心的旅程,探索安卓开发的世界。无论你是刚开始接触编程的新手,还是希望提升技能的资深开发者,这篇文章都将为你提供宝贵的知识和指导。我们将从基础概念入手,逐步深入到安卓开发的高级主题,包括UI设计、数据存储、网络通信等方面。通过阅读本文,你将获得一个全面的安卓开发知识体系,并学会如何将这些知识应用到实际项目中。让我们一起开启这段探索之旅吧!
|
4月前
|
缓存 NoSQL Java
【Azure Redis 缓存】定位Java Spring Boot 使用 Jedis 或 Lettuce 无法连接到 Redis的网络连通性步骤
【Azure Redis 缓存】定位Java Spring Boot 使用 Jedis 或 Lettuce 无法连接到 Redis的网络连通性步骤