有网络直接从网络请求数据,没有网络则从缓存读取数据。
请求接口文件如下
public interface MyApi {
@GET("/")
Call<String> getTest();
}
baseurl为http://www.appchina.com/
1.拦截器如下:
private Interceptor interceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();//拦截Request对象
Log.d("OkHttpUtils", "request.url():" + request.url());
Response response = chain.proceed(request);//获取服务器响应
if (TextUtils.isEmpty(response.cacheControl().toString())){
int time = 0;
//判断是否有网络 如果有网络就加载网络数据 没有网络就加载缓存数据
if (isNetworkAvailable()){
time = 0;
}else {
time = 60 * 60 * 24 * 365;
}
//生成新的response对象 往新的对象中手动添加Cache-Control 让其支持缓存
Response newReponse = response.newBuilder().addHeader("Cache-Control", "max-age="+time).build();
return newReponse;
}
return response;
}
};
//判断是否有网络
public boolean isNetworkAvailable() {
ConnectivityManager manager = (ConnectivityManager) getApplicationContext().getSystemService(
Context.CONNECTIVITY_SERVICE);
if (manager == null) {
return false;
}
NetworkInfo networkinfo = manager.getActiveNetworkInfo();
if (networkinfo == null || !networkinfo.isAvailable()) {
return false;
}
return true;
}
2.创建OkhttpClient并且添加缓存,添加上面的拦截器:
Cache cache = new Cache(context.getCacheDir(),1024*1024*10);//设置缓存内容的大小
OkHttpClient.Builder okhttpBuilder = new OkHttpClient.Builder();
okhttpBuilder.cache(cache);
//添加拦截器
okhttpBuilder.addInterceptor(interceptor);
OkHttpClient client = okhttpBuilder.build();
3.创建Retrofit:
builder1.addConverterFactory(ScalarsConverterFactory.create())
.baseUrl("http://www.appchina.com/")
.client(client);
retrofit = builder1.build();