retrofit+okhttp 实现缓存
来源:互联网 发布:海通证券行情软件 编辑:程序博客网 时间:2024/06/05 12:48
retrofit实现缓存 需要结合okhttp实现 其中需要实现拦截器,缓存大小,缓存目录,缓存时间,网络状态,
import android.content.Context;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.util.Log;import android.util.SparseArray;import com.dream.will.hydrogenballoon.MyApp;import com.dream.will.hydrogenballoon.utils.NetWorkUtil;import java.io.File;import java.io.IOException;import java.util.concurrent.TimeUnit;import okhttp3.Cache;import okhttp3.CacheControl;import okhttp3.Interceptor;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;import retrofit2.Retrofit;import retrofit2.converter.gson.GsonConverterFactory;/** * Created by Karlo on 2016/12/20. */public class RetrofitManager { private static final int MAX_AGE = 60 * 60; private static final int MAX_STALE = 60 * 60 * 24; private static final String CACHE_STALE = "public ,only if cached max-stale=" + MAX_STALE; private static final String CACHE_AGE = "public ,max-age=" + MAX_AGE; private static SparseArray<Retrofit> retrofitList = new SparseArray<>(); private static OkHttpClient client; public static Retrofit getInstance(int type) { Retrofit retrofit = retrofitList.get(type); if (retrofit == null) { retrofit = new Retrofit.Builder() .baseUrl(ApiConstant.getHostByType(type)) .addConverterFactory(GsonConverterFactory.create()) .client(getOkHttpInstance()) .build(); retrofitList.put(type, retrofit); } return retrofit; } private static OkHttpClient getOkHttpInstance() { if (null == client) { synchronized (RetrofitManager.class) { if (null == client) { File file = new File(MyApp.getInstance().getExternalCacheDir(), "okHttp"); client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .addInterceptor(new CacheControlIntercepter()) .addNetworkInterceptor(new CacheControlIntercepter()) .addInterceptor(new LogIntercepter()) .cache(new Cache(file, 10 * 1024 * 1024)) .build(); } } } return client; } private static class LogIntercepter implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); long t1 = System.nanoTime(); Log.i("google.karlo", String.format("Sending request %s on %s%n%s", request.url(), chain.connection(), request.headers())); Response response = chain.proceed(request); long t2 = System.nanoTime(); Log.i("google.karlo", String.format("Response message for %s in %.1fms%n%s", response.request().url(), (t2 - t1) / 1e6d, response.headers())); return response; } } private static class CacheControlIntercepter implements Interceptor { private static final String TAG = "CacheControlIntercepter"; @Override public Response intercept(Chain chain) throws IOException { Log.i("google.karlo", "CacheControlIntercepter"); Request request = chain.request(); if (!NetWorkUtil.isNetAvailable()) { Log.i("google.karlo", "CacheControlIntercepter: request not network"); request = request.newBuilder() /*没网,强制从内存中读取*/ .cacheControl(CacheControl.FORCE_CACHE) .build(); } Response response = chain.proceed(request); if (NetWorkUtil.isNetAvailable()) { Log.i("google.karlo", "CacheControlIntercepter: response ; isAvailable ");// String cacheControl = request.cacheControl().toString();// Log.i("Google.Karlo", TAG + "- intercept:" + cacheControl); /*有网络,设置缓存时长*/ return response.newBuilder() .removeHeader("Pragma")// .removeHeader("Cache-Control") .header("Cache-Control", CACHE_AGE) .build(); } else { /*没网络,查询缓存的Cache-Control设置,为if-only-cache时只查询缓存而不会请求服务器,max-stake可以配合设置缓存失效时间 * max-stale 指示客户端可以接受超出超时期间的响应消息。如果指定max-stale消息的值,那么客户端可接受超出超时期指定值之内的响应消息 * */ Log.i("google.karlo", "CacheControlIntercepter: response ; not isAvailable "); return response.newBuilder() .removeHeader("Pragma")// .removeHeader("Cache-Control") .header("Cache-Control", CACHE_STALE) .build(); } } } /** * 根据网络状况获取缓存策略 * @return */ public static String getCacheControl() { return NetWorkUtil.isNetAvailable() ? CACHE_AGE : CACHE_STALE; } private static class RequestIntercepter implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); ConnectivityManager manager = (ConnectivityManager) MyApp.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = manager.getActiveNetworkInfo(); if (activeNetworkInfo == null || !activeNetworkInfo.isAvailable() || !activeNetworkInfo.isConnected()) { Log.i("google.karlo", "RequestIntercepter: request not isAvailable"); request = request.newBuilder() .cacheControl(CacheControl.FORCE_CACHE) .build(); } return chain.proceed(request); } }}
0 0
- retrofit+okhttp 实现缓存
- 【缓存策略】Retrofit+OkHttp实现缓存处理
- Retrofit+okhttp 缓存的
- Retrofit+OKHttp实现缓存以及遇到的问题
- okhttp或者retrofit实现网络缓存504错误原因
- Android网络缓存,retrofit+okhttp
- 使用Retrofit和Okhttp实现网络缓存。无网读缓存,有网根据过期时间重新请求
- 使用Retrofit和Okhttp实现网络缓存。无网读缓存,有网根据过期时间重新请求
- Rxjava+Retrofit+okhttp+mvp实现
- Retrofit—okhttp Cache缓存策略
- Android使用Retrofit+OkHttp实现网络请求
- 终极封装 Rxjava+Retrofit+okhttp+mvp实现
- android Retrofit+OKhttp实现接口调用
- Retrofit+RxJava+Okhttp简单实现登录注册
- OKhttp+Retrofit
- 使用 Retrofit 和 okhttp 强制缓存失效问题
- Android Retrofit RxJava实现缓存
- 手动缓存Retrofit+OkHttp响应体,不再局限于Get请求缓存
- poj 3349 Snowflake Snow Snowflakes (hash)
- 存储类、链接和内存管理
- 【matlab】一种较方便的MATLAB GUI中popupmenu中选取值得获得方法
- 字符串和输入和输出
- HONEYPOT UTILITIES
- retrofit+okhttp 实现缓存
- Charts.js 图例添加点击事件
- ubuntu配置jdk环境变量
- DDR原理
- 文章标题
- Android内存泄漏的简单检查与分析方法 ---待完善
- BZOJ 2434 [Noi2011] 阿狸的打字机 Fail树
- 微信小程序之商城分类详情
- 0117考试总结