package com.liyu.fakeweather.http; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.liyu.fakeweather.App; import com.liyu.fakeweather.utils.FileUtil; import com.liyu.fakeweather.utils.NetUtils; 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.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** * Created by liyu on 2016/8/24. */ public class RetrofitManager { private static RetrofitManager instance; private static Retrofit retrofit; private static Gson mGson; private static String cookie = ""; private RetrofitManager() { retrofit = new Retrofit.Builder() .baseUrl("http://liyuyu.cn/") .client(httpClient()) .addConverterFactory(GsonConverterFactory.create(gson())) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); } public static void reset() { instance = null; } public static RetrofitManager getInstance() { if (instance == null) { synchronized (RetrofitManager.class) { instance = new RetrofitManager(); } } return instance; } public <T> T create(Class<T> service) { return retrofit.create(service); } private static OkHttpClient httpClient() { File cacheFile = new File(FileUtil.getAppCacheDir(App.getContext()), "/HttpCache"); Cache cache = new Cache(cacheFile, 1024 * 1024 * 100); Interceptor cacheInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (!NetUtils.isNetworkReachable(App.getContext())) { request = request.newBuilder() .cacheControl(CacheControl.FORCE_CACHE) .build(); } Response response = chain.proceed(request); if (NetUtils.isNetworkReachable(App.getContext())) { int maxAge = 0; // 有网络时 设置缓存超时时间0个小时 response.newBuilder() .removeHeader("Pragma") .header("Cache-Control", "public, max-age=" + maxAge) .build(); } else { // 无网络时,设置超时为1周 int maxStale = 60 * 60 * 24 * 28; response.newBuilder() .removeHeader("Pragma") .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale) .build(); } return response; } }; return new OkHttpClient.Builder() .cache(cache).addInterceptor(cacheInterceptor) .connectTimeout(15, TimeUnit.SECONDS) .readTimeout(20, TimeUnit.SECONDS) .writeTimeout(20, TimeUnit.SECONDS) .retryOnConnectionFailure(true) .build(); } public static Gson gson() { if (mGson == null) { synchronized (RetrofitManager.class) { mGson = new GsonBuilder().setLenient().create(); } } return mGson; } }