NoHttp封装--03 缓存
- 1、
Default模式,也是没有设置缓存模式时的默认模式 这个模式实现http协议中的内容,比如响应码是304时,当然还会结合E-Tag和LastModify等头。
StringRequest request = new StringRequest(url, method);
request.setCacheMode(CacheMode.DEFAULT);
- 2、 当请求服务器失败的时候,读取缓存 请求服务器成功则返回服务器数据,如果请求服务器失败,读取缓存数据返回。
StringRequest request = new StringRequest(url, method);
request.setCacheMode(CacheMode.REQUEST_NETWORK_FAILED_READ_CACHE);
- 3、如果发现有缓存直接成功,没有缓存才请求服务器 ImageLoader的核心除了内存优化外,剩下一个就是发现把内地有图片则直接使用,没有则请求服务器。
请求String,缓存String:
StringRequest request = new StringRequest(url, method);
// 非标准Http协议,改变缓存模式为IF_NONE_CACHE_REQUEST_NETWORK
request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST_NETWORK);
请求图片,缓存图片:
ImageRequest request = new ImageRequest(url, method);
request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST_NETWORK);
- 4、仅仅请求网络 无论如何也只会请求网络,也不支持http 304这种默认行为。
ImageRequest request = new ImageRequest(url, method);
request.setCacheMode(CacheMode.ONLY_REQUEST_NETWORK);
...
- 5、仅仅读取缓存 无论如何仅仅读取缓存,不会请求网络和其它操作。
Request<Bitmap> request = NoHttp.createImageRequest(imageUrl);
request.setCacheMode(CacheMode.ONLY_READ_CACHE);
注意:如果开发者想先得到缓存再请求网络,开发者可以先发起一个仅仅读取缓存的Request,然后发起一个仅仅请求网络的Request,不过本人已经在准备NoHttp2.0了,到时候将会以一个全新的面貌和开发者们见面。
缓存模式支持缓存任何数据,因为NoHttp保存数据是转为byte[],读取数据时是把byte[]转为开发者想要的数据,因此NoHttp的缓存可以支持任何自定义的Request。
服务器端:
@WebServlet("/cache")
public class CacheServlet extends BaseJsonServlet {
private static final long serialVersionUID = 14646L;
public CacheServlet() {
super();
}
@Override
protected String onResponse(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("返回新的数据");
return "NoHttp是最好用的Android网络框架。";
}
/**
* 服务端本接口的数据是否过期,没有过期则反悔相应头304,如果过期,会重新返回数据
*/
@Override
protected long getLastModified(HttpServletRequest req) {
// 这里主要是告诉http框架我们的数据是否被修改过,或者说是否过期
String path = getServletContext().getRealPath("index.html");
return new File(path).lastModified();
}
}
客户端:
public class CacheActivity extends Activity implements View.OnClickListener {
/**
* 标志请求是一般协议下的
*/
private final int nohttp_what_org = 0x01;
/**
* 标志请求是请求失败时读取缓存
*/
private final int nohttp_what_failed_read_cache = 0x02;
/**
* 标志请求是仅仅读取缓存的
*/
private final int nohttp_what_only_read_cache = 0x03;
/**
* 测试缓存图片
*/
private final int nohttp_what_only_read_cache_image = 0x04;
/**
* 显示请求数据
*/
private TextView mTvResult;
/**
* 显示请求图片
*/
private ImageView mIvImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cache);
findViewById(R.id.btn_request_org_cache).setOnClickListener(this);
findViewById(R.id.btn_request_failed_read_cache).setOnClickListener(this);
findViewById(R.id.btn_request_none_cache_request).setOnClickListener(this);
findViewById(R.id.btn_request_only_read_cache).setOnClickListener(this);
findViewById(R.id.btn_request_failed_read_cache_image).setOnClickListener(this);
mTvResult = (TextView) findViewById(R.id.tv_result);
mIvImage = (ImageView) findViewById(R.id.iv_image_cache);
}
private HttpCallBack<JSONObject> httpCallBack = new HttpCallBack<JSONObject>() {
@Override
public void onSucceed(int what, Response<JSONObject> response) {
JSONObject jsonObject = response.get();
String result = "";
if (what == nohttp_what_org) {
result += "标准协议,";
} else if (what == nohttp_what_failed_read_cache) {
result += "请求失败的时候显示缓存,";
} else if (what == nohttp_what_only_read_cache) {
result += "没有缓存时请求服务器,";
}
result += "是否来自缓存:" + response.isFromCache() + "\n数据:";
result += jsonObject.getString("data");
mTvResult.setText(result);
}
@Override
public void onFailed(int what, String url, Object tag, Exception exception, int responseCode, long networkMillis) {
}
};
private HttpCallBack<Bitmap> imageHttpCallBack = new HttpCallBack<Bitmap>() {
@Override
public void onSucceed(int what, Response<Bitmap> response) {
if (what == nohttp_what_only_read_cache_image) {
Bitmap bitmap = response.get();
mIvImage.setImageBitmap(bitmap);
mTvResult.setText("是否来自缓存:" + response.isFromCache());
}
}
@Override
public void onFailed(int what, String url, Object tag, Exception exception, int responseCode, long networkMillis) {
}
};
@Override
public void onClick(View v) {
String url = "http://192.168.1.116/HttpServer/news";
Request<JSONObject> request = new FastJsonRequest(url);
if (v.getId() == R.id.btn_request_org_cache) {
// 一般请求,走http标准协议
url = "http://192.168.1.116/HttpServer/cache";
request = new FastJsonRequest(url);
request.setCacheMode(CacheMode.DEFAULT);// DEFAULT表示走Http标准协议,默认就是,这里可以不用设置
CallServer.getInstance().add(this, request, httpCallBack, nohttp_what_org, true, false, true);
} else if (v.getId() == R.id.btn_request_failed_read_cache) {
// 请求失败的时候返回缓存
request.setCacheMode(CacheMode.REQUEST_FAILED_READ_CACHE);// REQUEST_FAILED_READ_CACHE表示走请求失败的时候读取缓存
CallServer.getInstance().add(this, request, httpCallBack, nohttp_what_org, true, false, true);
} else if (v.getId() == R.id.btn_request_none_cache_request) {
// 如果没有缓存才去请求服务器,否则使用缓存
request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST);// IF_NONE_CACHE_REQUEST表示没有缓存的时候去请求服务器
CallServer.getInstance().add(this, request, httpCallBack, nohttp_what_org, true, false, true);
} else if (v.getId() == R.id.btn_request_only_read_cache) {
// 仅仅请求缓存,不请求服务器
url = "http://192.168.1.116/HttpServer/only";
request = new FastJsonRequest(url);
request.setCacheMode(CacheMode.ONLY_READ_CACHE);// ONLY_READ_CACHE表示仅仅请求缓存,不请求服务器
CallServer.getInstance().add(this, request, httpCallBack, nohttp_what_org, true, false, true);
} else if (v.getId() == R.id.btn_request_failed_read_cache_image) {
// 如果没有缓存才去请求服务器,否则使用缓存,缓存图片演示,这一点非常适合封装一个自己的Imageloader是来使用
String imageUrl = "http://gtb.baidu.com/HttpService/get?p=dHlwZT1pbWFnZS9qcGVnJm49dmlzJnQ9YWRpbWcmYz10YjppZyZyPTMwMjEwODc5MTEsMTQxMDg4MDEwNgAAAA==";
Request<Bitmap> imageRequest = NoHttp.createImageRequest(imageUrl);
imageRequest.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST);
CallServer.getInstance().add(this, imageRequest, imageHttpCallBack, nohttp_what_only_read_cache_image, true, false, true);
}
}
}


NoHttp封装--03 缓存的更多相关文章
- NoHttp封装--03 cookie
NoHttp请求自动维持Cookie: 1.支持Session.Cookie.临时Cookie的位置. 2.支持App重启.关机开机后继续持久化维持. 3.提供了接口,允许开发者监听Coo ...
- Android 框架修炼-自己封装双缓存管理框架库
一.概述 Android开发中,网络请求是很重要的一部分,而缓存网络请求来的图片或者响应结果字符串或者结果流,既可以省流量,同时也可以帮助我们 解决无网或弱网情况下加载情况,当然也可以提升程序性能效率 ...
- Python网络编程03 /缓存区、基于TCP的socket循环通信、执行远程命令、socketserver通信
Python网络编程03 /缓存区.基于TCP的socket循环通信.执行远程命令.socketserver通信 目录 Python网络编程03 /缓存区.基于TCP的socket循环通信.执行远程命 ...
- # 095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 03 封装总结 01 封装知识点总结
095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- NoHttp封装--01
NoHttpActivity public class NoHttpActivity extends Activity implements View.OnClickListener { privat ...
- react native之封装离线缓存框架
请求数据=>本地有无缓存+缓存数据是否过期 =>可用 =>不可用 将代码封装成一个DataStore.js文件, 这里面主要提供:从本地获取数据,从网络获取数据,创建本地时间戳,请求 ...
- Ajax的封装03
一.Ajax 1.原理:基于http协议的 内置对象:XMLHttpRequest 发起请求 那会相应 步骤: var xhr=new XMLHttpRequest(); // 请 ...
- NoHttp封装--07 自定义异步任务框架
MainActivity: public class MainActivity extends Activity implements View.OnClickListener { .... @Ove ...
- NoHttp封装--05 文件下载
xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:la ...
随机推荐
- Android scrollview嵌套webview滑动冲突的解决方案
在Android开发中有时我们需要在scrollview中嵌套webview这时你会发现这两者的滑动事件产生了冲突导致:webview很难被滑动,即使被滑动了一点也非常不顺畅.解决方案也比较简单只需要 ...
- 你可能不知道的5种 CSS 和 JS 的交互方式
翻译人员: 铁锚 翻译日期: 2014年01月22日 原文日期: 2014年01月20日 原文链接: 5 Ways that CSS and JavaScript Interact That You ...
- android混淆和反编译
混淆 Android Studio: 只需在build.gradle(Module:app)中的buildTypes中增加release的编译选项即可,如下: <code class=&quo ...
- PLSQL WEBSERVICES 发布
一. 在Oracle EBS二次开发中,PL/SQL程序是开发人员使用频率最高的开发语言,同时也是大家最容易掌握的工具之一了,而我们也很希望将自己编写的PL/SQL程序发布为Web服务来提供给 ...
- 【面试笔试算法】Problem 9: 腾讯2016年研发实习笔试题:最长回文子串
(一)题目 问题:求给定字符串s的回文(palindrome)子串中,长度最大的回文子串的长度. 回文(palindrome)是指从左往右读和从右往左读字符串,看到的字符串都是一样的.比如" ...
- PS 图像调整算法——亮度调整
这个算法是参考自 阿发伯 的博客,在此对 阿发伯 表示感谢, http://blog.csdn.net/maozefa 亮度调整 非线性亮度调整: 对于R,G,B三个通道,每个通道增加相同的增量. 线 ...
- C语言之linux内核实现平方根计算算法
关于平方根的计算,在linux内核中也有实现,就像math.h数学库里的sqrt这个函数一样. 平方根的公式定义: 如果一个非负数x的平方等于a,即 , ,那么这个非负数x叫做a的算术平方 ...
- Android特效专辑(五)——自定义圆形头像和仿MIUI卸载动画—粒子爆炸
Android特效专辑(五)--自定义圆形头像和仿MIUI卸载动画-粒子爆炸 好的,各位亲爱的朋友,今天讲的特效还是比较炫的,首先,我们会讲一个自定义圆形的imageView,接着,我们会来实现粒子爆 ...
- apt-get Ubuntu本地ISO镜像入源
转自http://blog.csdn.net/binchel/article/details/21486999 在没有网络的情况下,本地镜像源不实为一个上等的权宜之计! 目前linux的两大主流包管理 ...
- 工作中常用Git指令操作
常用Git指令总结 前阵子有几天好不顺,可谓是喝水都呛着,更何况被Git给呛着了,还不轻,哈哈.所以打算总结一下自己在工作使用到Git相关的东西以及和大家探讨使用GIt的心得体会.于是,关于Git的的 ...