安卓缓存指引

原创 2016年12月18日 19:09:43

缓存明确两点

1 各大缓存的优劣之处

2 针对应用场景选取不同的方案,项目开发分析选取的缓存方案

各大缓存
简单的数据库操作

**Android ORM 框架之 greenDAO
虎扑项目Tlint中用到的**

http://www.open-open.com/lib/view/open1438065400878.html

比较好的缓存

鸿洋的base-diskcache(根据ASimpleCache改的LruCache)
https://github.com/hongyangAndroid/base-diskcache

get请求可以通过设置拦截器缓存,okhttp设置拦截器

  • 统一的header设置可以在okhttp设置拦截器,如果是分开的,可以在Observe分别定义Header)

  • 统一添加header

get请求缓存的网络拦截器,需要声明缓存路径,缓存时长,maxStale和maxAge都定义的话默认maxStale的大小,具体参数还需要研究补充
http://blog.csdn.net/u014614038/article/details/51210685#comments
有网的情况就刷新数据,maxAge为0

设置get请求拦截器,post就不行了

builder.addNetworkInterceptor();

public class NetworkInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        if (!NetUtils.hasNetwork(MyApplication.getContext())) {
            request = request.newBuilder()
                    .cacheControl(CacheControl.FORCE_CACHE)
                    .build();
//            Logger.t(TAG).w("no network");
        }
        Response response = chain.proceed(request);
        if (NetUtils.hasNetwork(MyApplication.getContext())) {
            int maxAge = 0 * 60;
            //有网的时候读接口上的@Headers里的配置,你可以在这里进行统一的设置
            String cacheControl = request.cacheControl().toString();
            return response.newBuilder()
                    .header("Cache-Control", "public, max-age=" + maxAge)
       /*     return response.newBuilder()
                    .header("Cache-Control", cacheControl)*/
                    .removeHeader("Pragma")
                    .build();

        } else {
            int maxStale = 60 * 60 * 24 * 28;

            return response.newBuilder()
                    .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                    .removeHeader("Pragma")
                    .build();
        }



       /* Request originalRequest = chain.request();
        Response response_original = chain.proceed(originalRequest)
                .newBuilder()
                .removeHeader("Pragma")
                .removeHeader("Cache-Control")
                .header("Cache-Control", "max-age=" + 3600 * 24 * 30).build();
        LogUtil.e(response_original.cacheResponse().toString());
        return response_original;*/
    }
}

设置Log拦截器,打印请求信息或者响应信息


public class LoggingInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        long t1 = System.nanoTime();
        Logger.e(String.format("Sending request %s on %s%n%s",
                request.url(), chain.connection(), request.headers()));
        Response response = chain.proceed(request);
        long t2 = System.nanoTime();
//        Logger.e(String.format("Received response for %s in %.1fms%n%s",
//                response.request().url(), (t2 - t1) / 1e6d, response.headers()));
        return response;
    }
}

设置token拦截器

public class TokenInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request originalRequest = chain.request();
//                || alreadyHasAuthorizationHeader(originalRequest) 对象不同 等改成单例 先测试

        if (UserManager.getUserInfo() == null) {
            Response response_original = chain.proceed(originalRequest);
            return response_original;
        } else {
            Request request_authorised = originalRequest.newBuilder()
                    .header("token", UserManager.getUserInfo().getToken())
                    .build();


            Logger.e("添加header " + UserManager.getUserInfo().getToken());
            Response response_authorise = chain.proceed(request_authorised);
            return response_authorise;
        }
    }
}
   public static OkHttpClient getOKhttpInstance() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(15, TimeUnit.SECONDS);
        builder.readTimeout(20, TimeUnit.SECONDS);
        builder.writeTimeout(20, TimeUnit.SECONDS);
        //错误重连
        builder.retryOnConnectionFailure(true);
        //请求头加入token
        builder.addInterceptor(new TokenInterceptor());
        return builder.build();
    }

  • 单独的头部设置,
@POST("index/Chat/down")
@Headers("Cache-Control: public, max-age=3600")
@FormUrlEncoded
Observable<BaseResponseBody<Message>> getMessage(@FieldMap Map<String, String> params);

Rxjava配合RxCache缓存

Rxcache相关(json解析配合文档中的一种才行)
看demo会比较好,配合Rxjava使用很方便,具体再研究,主要用了阿里的fastjson,没搭配作者的json解析

github地址
https://github.com/VictorAlbertos/RxCache

Because RxCache uses internally Jolyglot to serialize and deserialize objects, you need to add one of the next dependency to gradle.

dependencies {
    // To use Gson 
    compile 'com.github.VictorAlbertos.Jolyglot:gson:0.0.3'

    // To use Jackson
    compile 'com.github.VictorAlbertos.Jolyglot:jackson:0.0.3'

    // To use Moshi
    compile 'com.github.VictorAlbertos.Jolyglot:moshi:0.0.3'
}

Rxcache中文使用教程
https://github.com/sungerk/RxCache/blob/master/README_ZH.md

Demo地址
https://github.com/VictorAlbertos/RxCacheSamples

Rxcache源码解析
http://www.jianshu.com/p/5d73909c7068

版权声明:本文为博主原创文章,未经博主允许不得转载。

关于android新手引导的开源使用

做APP的时候难免用到新手引导的效果。 先放一张效果的图片吧。虽然丑了点,讲究实用吧。 本人在开发的时候,使用了github这位同学的开源代码,这里推荐一下开源的githu...
  • qq_21139343
  • qq_21139343
  • 2017年01月18日 14:57
  • 1188

WPF 实现新手指引功能 DEMO

需求 1.接口化.其他人实现接口就行 2.动态定位到visualTree中任意控件位置,即随意只显示任何部位 3.指示文本控件和箭头控件随意更改(位置,大小,高度,偏移等基本属性) 4.抽出主题 [d...
  • wmz545546
  • wmz545546
  • 2017年08月11日 11:18
  • 133

一个超级方面的用户指引view—App实现用户指引就是如此简单

参考:点击打开链接http://www.jianshu.com/p/9e4fa6c25687 效果图 最近有小伙伴问我APP应用实现用户指引有没有好的方...
  • yhy123456q
  • yhy123456q
  • 2017年09月05日 13:44
  • 304

微信公众平台开发-入门指引

入门指引微信端开发必须在外网的环境中 申请服务器 搭建服务(将项目部署在申请的服务器中,公众平台接口调用仅支持80端口,所以将端口号设置为80,默认时是80) 申请公众号 申请公众号网页 邮箱激活后...
  • ITresource
  • ITresource
  • 2016年12月07日 17:36
  • 284

新手指引页功能实现

新手指引页功能实现在本期版本更新的需求中添加了新手指引页功能,从网上看了去多大神的实现方式,有用自定义View来自己挖透明区域的,也有透明图来实现遮盖的,时间紧迫就采用UI给图遮盖的实现方式。 自...
  • Ivenes
  • Ivenes
  • 2016年11月10日 17:07
  • 138

iOS-添加新手操作指引

添加新手操作指引
  • xiaoluodecai
  • xiaoluodecai
  • 2016年03月04日 17:53
  • 1441

安卓系统dns缓存策略

介绍Android系统的DNS缓存策略和注意事项
  • oscaryue
  • oscaryue
  • 2017年09月11日 15:37
  • 1006

Android开发技巧——高亮的用户操作指南

Android开发技巧——高亮的用户操作指南一不小心成了博客之星的候选人,还有许多朋友帮我投票,无以回报,只能再写一篇以表答谢各位的支持。前面四篇写了关于自定义控件的一些基础知识。在我的理解中,其实做...
  • maosidiaoxian
  • maosidiaoxian
  • 2015年12月10日 12:42
  • 3991

安卓_缓存

//布局文件 xml version="1.0" encoding="utf-8"?> LinearLayout xmlns:android="http://schemas.android.co...
  • qq_39707849
  • qq_39707849
  • 2017年08月22日 20:01
  • 112

安卓缓存

安卓缓存路径:Android/data/com.tencent.qqlive/cache/download
  • u011269801
  • u011269801
  • 2014年10月28日 23:41
  • 370
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:安卓缓存指引
举报原因:
原因补充:

(最多只允许输入30个字)