Android Retrofit 网络请求+Ok拦截器+三级缓存

//需要的自提

public class RetrofitManager {

    private static RetrofitManager mRetrofitManager;

    private final Retrofit mRetrofit;

    private static String BASE_URL = "https://www.zhaoapi.cn/";

    public RetrofitManager(String baseUrl) {

        mRetrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(bulidOkHttpClient())
                .build();


    }

    public static RetrofitManager getDefault() {

        return mRetrofitManager = new RetrofitManager(BASE_URL);

    }

    private OkHttpClient bulidOkHttpClient() {
        //缓存路径
        File cacheFile = new File(App.getContext().getCacheDir().getAbsolutePath(), "HttpCache");
        Cache cache = new Cache(cacheFile, 1024 * 1024 * 10);//缓存文件为10MB

        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        HashMap<String, String> map = new HashMap<>();
        map.put("source", "android");
        map.put("appVersion", "101");
        PublicParamInterceptor paramInterceptor = new PublicParamInterceptor(map);
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .readTimeout(5000, TimeUnit.MILLISECONDS)
                .writeTimeout(5000, TimeUnit.MILLISECONDS)
                .connectTimeout(5000, TimeUnit.MILLISECONDS)
                .addInterceptor(httpLoggingInterceptor)
                .addInterceptor(paramInterceptor)
                .addInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        int maxAge = 60*60; // 有网络时 设置缓存超时时间1个小时
                        int maxStale = 60 * 60 * 24 * 28; // 无网络时,设置超时为4周
                        Request request = chain.request();
                        if (OkHttpUtil.isNetworkReachable(App.getContext())) {
                            request= request.newBuilder()
                                    .addHeader("apikey", "2ffc3e48c7086e0e1faa003d781c0e69")
                                    .cacheControl(CacheControl.FORCE_NETWORK)//有网络时只从网络获取
                                    .build();
                        }else {
                            request= request.newBuilder()
                                    .cacheControl(CacheControl.FORCE_CACHE)//无网络时只从缓存中读取
                                    .build();
                        }
                        Response response = chain.proceed(request);
                        if (OkHttpUtil.isNetworkReachable(App.getContext())) {
                            response= response.newBuilder()
                                    .removeHeader("Pragma")
                                    .header("Cache-Control", "public, max-age=" + maxAge)
                                    .build();
                        } else {
                            response= response.newBuilder()
                                    .removeHeader("Pragma")
                                    .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                                    .build();
                        }
                        return response;
                    }

                })
                .connectTimeout(2, TimeUnit.SECONDS)
                .cache(cache)

                .build();

        return okHttpClient;
    }

    public <T> T create(Class<T> Clazz) {

        return mRetrofit.create(Clazz);

    }

    public class PublicParamInterceptor implements Interceptor {
        Map<String, String> paramMap = new HashMap<>();

        public PublicParamInterceptor(Map<String, String> paramMap) {
            this.paramMap = paramMap;
        }

        @Override
        public Response intercept(Interceptor.Chain chain) throws IOException {
            //拿到原来的request
            Request oldRequest = chain.request();
            //拿到请求的url地址
            String url = oldRequest.url().toString();
            //判断是get还是post请求
            if (oldRequest.method().equalsIgnoreCase("GET")) {
                if (paramMap != null && paramMap.size() > 0) {
                    StringBuilder builder = new StringBuilder(url);
                    //接收公共的请求参数
                    for (Map.Entry<String, String> entry : paramMap.entrySet()) {
                        builder.append("&" + entry.getKey() + "=" + entry.getValue());
                    }
                    url = builder.toString();
                    //如果之前的url没有?,我们需要手动给添加一个?
                    if (!url.contains("?")) {
                        url = url.replaceFirst("&", "?");
                    }

                    //根据原来的request构造一个新的request
                    Request request = oldRequest.newBuilder()
                            .url(url)
                            .build();
                    return chain.proceed(request);
                }
            } else {
                if (paramMap != null && paramMap.size() > 0) {
                    RequestBody body = oldRequest.body();
                    if (body != null && body instanceof FormBody) {
                        FormBody formBody = (FormBody) body;
                        //把原来body里面的参数添加到新的body中
                        FormBody.Builder builder = new FormBody.Builder();
                        //为了防止添加相同的key和value
                        HashMap<String, String> temMap = new HashMap<>();
                        for (int i = 0; i < formBody.size(); i++) {
                            builder.add(formBody.encodedName(i), formBody.encodedValue(i));
                            temMap.put(formBody.encodedName(i), formBody.encodedValue(i));
                        }
                        //把公共请求的参数添加到新的body中
                        for (Map.Entry<String, String> entry : paramMap.entrySet()) {
                            if (!temMap.containsKey(entry.getKey())) {
                                builder.add(entry.getKey(), entry.getValue());
                            }
                        }
                        FormBody newformBody = builder.build();
                        //依据原来的request构造一个新的request
                        Request request = oldRequest.newBuilder()
                                .post(newformBody)
                                .build();
                        return chain.proceed(request);
                    }
                }
            }
            return chain.proceed(oldRequest);
        }
    }
}

//okHttpUtils

/**
 * 判断网络是否可用
 *
 * @param context Context对象
 */
public static Boolean isNetworkReachable(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo current = cm.getActiveNetworkInfo();
    if (current == null) {
        return false;
    }
    return (current.isAvailable());
}

猜你喜欢

转载自blog.csdn.net/as89751/article/details/81807459