教你如何使用okhttp缓存
来源:互联网 发布:c语言编程界面 编辑:程序博客网 时间:2024/04/23 13:25
本文更新于2017-1-18,基于okthhp 3.5.0测试,最好查看原文,因为可能会更新
转载务必注明出处:http://blog.csdn.net/u014614038/article/details/51210685
使用方法很简单:
1.首先进行先进行设置:
public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/json; charset=utf-8");//设置MediaTypeprivate static final OkHttpClient client;private static final long cacheSize = 1024*1024*20;//缓存文件最大限制大小20Mprivate static String cachedirectory = FilePathroot + "/caches"; //设置缓存文件路径private static Cache cache = new Cache(new File(cachedirectory), cacheSize); //static {OkHttpClient.Builder builder = new OkHttpClient.Builder();builder.connectTimeout(8, TimeUnit.SECONDS); //设置连接超时时间builder.writeTimeout(8, TimeUnit.SECONDS);//设置写入超时时间builder.readTimeout(8, TimeUnit.SECONDS);//设置读取数据超时时间builder.retryOnConnectionFailure(false);//设置不进行连接失败重试builder.cache(cache);//这种缓存client = builder.build();}
注意的是:okhttp只会对get请求进行缓存,post请求是不会进行缓存,这也是有道理的,因为get请求的数据一般是比较持久的,而post一般是交互操作,没太大意义进行缓存。
2.进行get请求:
一般来说的是,我们get请求有时有不一样的需求,有时需要进行缓存,有时需要直接从网络获取,有时只获取缓存数据,这些处理,okhttp都有帮我们做了,我们做的只需要设置就是了。下面是整理的各种需求的设置与使用方法。
1.进行get请求,并将数据缓存。
/** *@param url *@param cache_maxAge_inseconds 缓存最大生存时间,单位为秒 *@return 当前call *-------------------- *TODO get请求,并缓存请求数据,返回的是缓存数据,注意,如果超出了maxAge,缓存会被清除,回调onfail */public static Call DoGetAndCache(String url,int cache_maxAge_inseconds) {Request request = new Request.Builder().cacheControl(new CacheControl.Builder().maxAge(cache_maxAge_inseconds, TimeUnit.SECONDS).build()).url(url).build();Call call = client.newCall(request);startrequest(call);return call;}
2.get请求,但只获取返回网络数据。
/** * get请求 ,只获取返回网络请求数据,不进行缓存 * * @param url * @param responseListener */public static Call DoGetOnlyNet(String url) {Request request = new Request.Builder().cacheControl(new CacheControl.Builder().maxAge(0, TimeUnit.SECONDS).build()).url(url).build();Call call = client.newCall(request);startrequest(call);return call;}
3.进行get请求,并限制过时时间
/** * get请求, 没有超过过时时间StaleTime的话,返回缓存数据,否则重新去获取网络数据,StaleTime限制了默认数据fresh时间 * @param url * @param staletime 过时时间,秒为单位 */public static Call DoGetInStaleTime(String url, int staletime) {Request request = new Request.Builder().cacheControl(new CacheControl.Builder().maxStale(staletime, TimeUnit.SECONDS).build()).url(url).build();Call call = client.newCall(request);startrequest( call);return call;}
这里说明下StaleTime与maxAge的区别。
StaleTime:指的是过时时间,设置它后,会将数据缓存,如果没有超过过时时间,说明数据还是新的,或直接拿缓存数据返回,如果超过是过时时间,那么我们认为数据过时了,它会去或者网络数据进行更新并返回,注意,它是不会删除缓存的。
maxAge:限制了缓存的生存时间,超过了就会删除该请求的缓存。
4.只获取返回缓存数据
/** * get请求, 只使用缓存,注意,如果是超出了staletime或者超出了maxAge的话会返回504,否则就返回缓存数据 * @param url */public static Call DoGetOnlyCache(String url) {Request request = new Request.Builder().cacheControl(new CacheControl.Builder().onlyIfCached().build()).url(url).build();Call call = client.newCall(request);startrequest(call);return call;
private static void startrequest(final Call call0) {try {call0.enqueue(new Callback() {@Overridepublic void onFailure(Call arg0, IOException arg1) {//请求失败}@Overridepublic void onResponse(Call arg0, Response response) throws IOException {//请求返回数据}});} catch (Exception e) {}}
下面测试一下,设置缓存maxAge为10秒,我们将请求返回的数据打印出来:
上面图片的1是点击获取的服务器的数据,获取后断开网络然后继续点击,可以看到2还能获取到数据,说明这是缓存的数据,当到3时,差不多就是十秒的时间,可以看到,获取数据失败了,这时已经去服务器获取数据了,缓存被清空,由于断开网络所以请求失败。
以上都是本人查看官方文档并进行测试验证后整理的,有不对的地方,万请指正。
4 0
- 教你如何使用okhttp缓存
- Okhttp框架缓存使用
- okhttp的使用极其缓存
- 关于OKHTTP与图片缓存的使用
- OkHttp相关使用和设置缓存
- OkHttp基本使用(四)缓存
- okhttp的详解及其缓存的使用
- OkHttp缓存
- OKhttp缓存
- okhttp缓存
- 教你如何清除应用程序缓存
- 如何更高效地使用 OkHttp
- 如何更高效地使用 OkHttp
- 如何更高效地使用 OkHttp
- 如何使用OkHttp/Retrofit重试HTTP请求
- 使用 Retrofit 和 okhttp 强制缓存失效问题
- Okhttp和Picasso配合使用外加ACache实现缓存
- Android自学历程—手把手教你使用OkHttp(含各种请求方法)
- 重建二叉树
- nodejs中exports与module.exports的区别
- Android源码解析之(十三)-->apk安装流程
- 机器学习课堂笔记(十二)
- 数据结构之物流信息的归并排序(非递归实现)
- 教你如何使用okhttp缓存
- VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar)
- WPF 的 BackgroundWorker
- 学习心得-------计算机网络基础(1)
- CV_CAST_8U(val);的意义!
- AFNetworking 返回错误unsupported media type (415) 解决方案
- 关于Java Serial Version UID的一些说明
- 决策树分类算法之ID3
- 多进程并发编程----基于高级的动态创建进程池的模型