1.使用单例模式封装网络请求对象
2.使用Retrofit请求网络
3.配置Retrofit缓存模块 .client(okHttpClient()) 使用的是网络拦截器( .addNetworkInterceptor(new NetWorkInterceptor()))
4.配置日志拦截器LoggingInterceptor
public class HttpManager {
private static HttpManager httpManager;
private HttpManager() {
}
// 双重检查锁模式 (DCL)double check locked
public static HttpManager getInstance() {
if (httpManager == null) {
synchronized (HttpManager.class) {
if (httpManager == null) {
httpManager = new HttpManager();
}
}
}
return httpManager;
}
public Retrofit getRetrofit(String url) {
return new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create() )
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(okHttpClient())
.build();
}
public OkHttpClient okHttpClient() {
//配置缓存的目录及大小 日志拦截器 缓存拦截器
final OkHttpClient build = new OkHttpClient.Builder()
.cache(new Cache(MyApp.myApp.getCacheDir(), 10 * 1024 * 1024))
.addInterceptor(new LoggingInterceptor())
.addNetworkInterceptor(new NetWorkInterceptor())
.build();
return build;
}
class NetWorkInterceptor implements Interceptor{
Request request;
@Override
public Response intercept(Chain chain) throws IOException {
request = chain.request();
if (!SystemUtils.checkNetWork()){
request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
}
Response response = chain.proceed(request);
if (!SystemUtils.checkNetWork()){
int maxAge=0;
return response.newBuilder().removeHeader("Pragma").header("Cache-Control","public ,max-age="+maxAge).build();
}else{
int maxTime = 60*60 *24;
return response.newBuilder().removeHeader("Pragma").header("Cache-Control","public ,max-age="+maxTime).build();
}
}
}
/**
* 日志拦截器
*/
class LoggingInterceptor implements Interceptor{
@Override
public Response intercept(Chain chain) throws IOException {
long start = System.nanoTime();
Request request = chain.request();
Response proceed = chain.proceed(request);
long end = System.nanoTime();
Log.i("Request:",String.format("Sending request %s on %s%n%s",request.url(),chain.connection(),request.headers()));
Log.i("interceptor","time="+(end-start)+"ms");
return proceed;
}
}
}