主要介绍可同步或异步获取数据、可自动根据服务器的返回头判断是否需要缓存、可自动根据请求头信息判断是否读取缓存的网络缓存。
本文分为四部分包括使用示例、功能介绍、原理介绍、疑问解答。
更多 Android 网络库开源项目可见:Android 网络库。
适用:网络获取内容不大的应用,尤其是api接口数据,如新浪微博、twitter的timeline、微信公众账号发送的内容等等。
Demo APK 可以方便的查看效果,在各大应用商店搜索 trinea android 下载即可,如:Google Play。
示例代码地址见HttpCacheDemo,效果图如下:
1、使用
(1)引入公共库
引入TrineaAndroidCommon@Github(欢迎star和fork^_^)作为你项目的library(如何拉取代码及添加公共库)。
(2)调用
仅需简单两步:
a. 定义缓存
1 |
private HttpCache httpCache = new HttpCache(context); |
或获取全局唯一实例HttpCache
1 |
private HttpCache httpCache = CacheManager.getHttpCache(context); |
b. 调用httpGet函数同步或异步获取网络数据
以httpGet函数异步获取数据为例,其他接口见第2部分介绍
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”);
更多 Android 网络库开源项目可见:Android 网络库
创建时。 HttpCache httpCache = CacheManager.getHttpCache(this); 报错
VFY: unable to resolve static method 3383: Lcn/trinea/android/common/util/CacheManager;.getHttpCache (Landroid/content/Context;)Lcn/trinea/android/common/service/HttpCache;
没有httpCache.httpPost方法吗?
cache 中当时没加 post,可通过扩展 HttpUtils.httpPost 函数完成
mark
Pingback: Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类 | 数据魔方
Pingback: 性能优化之Java(Android)代码优化
Pingback: Android开源项目分类总结(转) - 有Bug
为什么不前台自己控制缓存时间
所有可变的不要在客户端写死,放在服务端配置,不需要升级应用也能生效