[置顶] 当NoHttp遇到Http缓存的变得如何强大

NoHttp使用之强大的Http缓存功能

技术交流1群:46523908
技术交流2群:46505645
NoHttp 源码及Demo托管在Github欢迎大家Star:https://github.com/Y0LANDA/NoHttp

NoHttp是专门做Android网络请求与下载的框架。

AndroidStuio和Eclipse怎么使用NoHttp

见视频,视频来自直播,欢迎大家加上面的QQ群来看我直播。

前言

  我们在开发中经常会遇到一下要求或者问题:

  • 按照Http标准的协议做缓存,比如响应码是304时使用缓存。
  • 请求失败、网络不好和者服务器发生问题时,APP要显示之前的缓存数据。
  • 如果缓存不存在才请求服务器,否则使用缓存。
  • 只使用缓存,不去请求服务器。

  当前上面这些请求可能不是每一个人都遇到过,但是比如第一条和第二条应该是很多人都遇到的。那么我们想想这些怎么实现呢?……嗯对,想想都需要很多代码,但是如果我们使用NoHttp的话,这些能统统只需要一句话,我们分别来看看这四种情况。

1. Http标准协议的缓存,比如响应码是304时

  当我们第一次请求服务器的时候,服务器返回结果,并且在相应头中添加一个Last-Modified的头,这个头的意思是告诉你,返回给你的结果最后的修改时间是什么时候,而且你检查到这个头的时候,要把本次的结果缓存起来,当你下载请求服务器的时候要在请求头中带上这个时间,但是请求头的名称叫If-Modified-Since,这头的意思就是客户端上次请求服务器的时候服务器告诉客户端的数据修改时间是什么时候。服务端会拿这个请求头和数据的修改时间做对比,如果这个时间比服务端数据修改时间新或者等于,那么服务端返回的响应码不是200而是304,这时候你就可以不用从流中读取数据(流中也没有数据给客户端读),而是去拿上次的缓存;如果说这个时间比服务器的数据时间旧,说明数据发生了变化,这时候需要重新从流中读取数据。

Request<JSONObject> request = NoHttp.createJsonObjectRequest(url);
// NoHttp本身是RESTFUL风格的标准Http协议,所以这里不用设置或者设置为DEFAULT
request.setCacheMode(CacheMode.DEFAULT);
...

2. 当请求服务器失败的时候,读取缓存

  每次都兼容第一种情况,但是不论如何,在请求失败的时候,都返回缓存(但是前提是有过一次成功的请求)。如果开启了失败后返回缓存的功能,那么每个请求都会被NoHttp缓存下来,不管是什么请求方法,或者服务器有没有带Last-Modified的头。

Request<JSONObject> request = NoHttp.createJsonObjectRequest(url);
// 非标准Http协议,改变缓存模式为REQUEST_FAILED_READ_CACHE
request.setCacheMode(CacheMode.REQUEST_FAILED_READ_CACHE);
...

3. 仅仅读取缓存

  不请求服务器只读取本地的缓存,如果没有缓存会请求失败,监听器的onFailed方法的exception参数是NotFoundCacheError。

Request<JSONObject> request = NoHttp.createJsonObjectRequest(url);
// 非标准Http协议,改变缓存模式为ONLY_READ_CACHE
request.setCacheMode(CacheMode.ONLY_READ_CACHE);
...

4. 如果发现有缓存直接成功,没有缓存才请求服务器

  我们知道ImageLoader的核心除了内存优化外,剩下一个就是发现把内地有图片则直接使用,没有则请求服务器,所以NoHttp这一点非常适合做一个ImageLoader,等待大神做一个封装出来。

Request<JSONObject> request = NoHttp.createJsonObjectRequest(url);
// 非标准Http协议,改变缓存模式为IF_NONE_CACHE_REQUEST
request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST);
...

  这里我们请求一张图片看,利用这一点非常适合封装一个自己的Imageloader是来使用

// 如果没有缓存才去请求服务器,否则使用缓存,缓存图片演示
Request<Bitmap> request = NoHttp.createImageRequest("http://image.tianjimedia.com/uploadImages/2013/214/CN267OUS22LM.jpg");
request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST);
...

  注意:缓存不管是String、Json、图片还是任何请求都可以被NoHttp缓存
  而且NoHttp请求服务器、上传文件、下载文件、支持Android系统的八种请求方法(GET、POST、DELETE、HEAD…)、队列、同步请求、异步请求、和Activity联动取消请求等强大功能,所以在Android的Http模块是一个很不错的选择。

NoHttp 源码及Demo托管在Github欢迎大家Star:https://github.com/Y0LANDA/NoHttp

你可能感兴趣的:(android,缓存,http缓存,okhttp,NoHttp)