美文网首页性能优化Android开发Android开发经验谈
Retrofit和OkHttp实现 Android网络缓存

Retrofit和OkHttp实现 Android网络缓存

作者: TTLLong | 来源:发表于2018-03-16 11:36 被阅读688次

    前提:

        没做过网络缓存这方面的功能,所以想学习下。上网看了很多的文章,也看了部分视频。想把自己的一些小小的心德分享一下。如何能够稍微帮助到别人,那对我来说就算是有意义了。废话不多说了。进入正题。

    1.网路请求

        网络请求用的是Retrofit。用过的人,都知道优点。没用过的人就照着图示或者Demo去写就好了,而且网上的文章一大堆,本人就不赘述了。

    网络请求的写法

    2.添加缓存

        重点来了,在网上看了许多的缓存方法。到最后还是选择了,OkHttp添加拦截器的这种方法。貌似用这种方法的人最多。

    先来两张图,在做解释。

    基本设置

    这里设置了读写连接的超时时间。还设置了cookie的持久化。CookieJar有两个回调接口。用一个HashMap来保存cookie,在saveFromResponse中保存。在需要的时候在loadForRequest中取出。这样就能每次请求中都携带Cookie了。

    网络缓存

    这里就是本文的重点如何缓存了。

    1.先获取一个File实例,这个文件夹是专门用来保存缓存文件的。

    2.实例化一个Cache对象,他的第一个参数就是之前的File实例,第二个是文件夹的最大缓存大小。

    3.添加拦截器,Okhttp的拦截器是一个很好的东西。无论是统一添加header,还是通过HttpLoggingInterceptor将传输的数据通过log形势答应出来,包括添加缓存都需要用到它。首先我们要确定一个思维,就是缓存的策略。在有网络的时候,我们成功获取数据,同时将他缓存到本地。当无网络的时候,从本地取出我们之前缓存好的数据,进行加载。这样就完成了数据的缓存。缓存的代码可以当做固定代码。网上也有很多讲CacheControl的缓存策略的。这里也不赘述了。

    3.注意事项

    权限问题,尤其是6.0以上需要动态申请。在授予权限的时候需要注意。

    另外,OkHttp的缓存只能用于Get请求。OkHttp的Cache类中,对于GET以外的请求,都返回null。源码中也做出了解释:不允许Get以外的请求,从技术上是允许post请求的。但是他的复杂度很高,实用性太低。

    只能GET的原因

    结束语:

    最后外加一个Demo的地址:

    https://github.com/13046434521/CacheDemo

    具体的代码有什么不清楚的可以去这里查看。感谢各位亲。至此,感谢!如果喜欢的话可以点波关注!风里雨里在这里等你。哈哈,感谢!

    Demo

    相关文章

      网友评论

      • 061faac9d80b:okhttp内部有缓存拦截器的实现,实际上不需要你额外添加的,你只需要开启缓存就可以了。另外你这种Cookie的实现方式只能一次运行期间有效,应用重启后,Cookie就丢失了。
        TTLLong:@七岁就狠拽 没错,所以在拦截器里,自己加了header。另外文章里也写了,只对Get请求有效。
        七岁就狠拽:Okhttp内部的缓存拦截器要服务器支持缓存, 自己设置的不需要, 这些缓存只能在get请求下有效吧
        Mr云台:楼上说的是对的

      本文标题:Retrofit和OkHttp实现 Android网络缓存

      本文链接:https://www.haomeiwen.com/subject/fqafqftx.html