package com.silencedut.knowweather.network; import com.silencedut.knowweather.WeatherApplication; import com.silencedut.knowweather.network.api.WeatherApi; import com.silencedut.knowweather.utils.Check; import com.silencedut.knowweather.utils.FileUtil; import com.silencedut.knowweather.utils.NetWork; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.annotation.Nullable; 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 SilenceDut on 16/10/28. */ public class AppHttpClient { private static final int HTTP_RESPONSE_DISK_CACHE_MAX_SIZE = 10 * 1024 * 1024; private static final int MAX_AGE = 60 * 10; //with network 10min private static final int MAX_STALE = 60 * 60 * 24; //1 day ,no network private volatile static AppHttpClient sAppHttpClient; private Map<String, Object> serviceByType = new HashMap<>(); private Retrofit mRetrofit; private AppHttpClient() { OkHttpClient client = new OkHttpClient.Builder().addInterceptor(cacheInterceptor()).cache(cache()).build(); mRetrofit = new Retrofit.Builder().baseUrl(WeatherApi.BASE_URL).client(client).addConverterFactory(GsonConverterFactory.create()).build(); } private Cache cache() { final @Nullable File baseDir = FileUtil.getExternalCacheDir(WeatherApplication.getContext()); final File cacheDir = new File(baseDir, "HttpResponseCache"); return (new Cache(cacheDir, HTTP_RESPONSE_DISK_CACHE_MAX_SIZE)); } private Interceptor cacheInterceptor() { return new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (!NetWork.isAvailable(WeatherApplication.getContext())) { request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build(); } Response originalResponse = chain.proceed(request); if (NetWork.isAvailable(WeatherApplication.getContext())) { return originalResponse.newBuilder().header("Cache-Control", "public ,max-age=" + MAX_AGE).build(); } else { return originalResponse.newBuilder().header("Cache-Control", "public, only-if-cached, max-stale=" + MAX_STALE).build(); } } }; } public static AppHttpClient getInstance() { if (sAppHttpClient == null) { synchronized (AppHttpClient.class) { if (sAppHttpClient == null) { sAppHttpClient = new AppHttpClient(); } } } return sAppHttpClient; } public synchronized <T> T getService(Class<T> apiInterface) { String serviceName = apiInterface.getName(); if (!Check.isNull(serviceByType.get(serviceName))) { return (T) serviceByType.get(serviceName); } T service = mRetrofit.create(apiInterface); serviceByType.put(serviceName, service); return service; } }