public class RetrofitUtils { private final Retrofit retrofit; private RetrofitUtils(){ retrofit = new Retrofit.Builder() .client(getOkHttpClient()) .baseUrl("http://www.baidu.com/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(Rx .build(); } private static RetrofitUtils retrofitUtils; public static RetrofitUtils getInstance(){ if(retrofitUtils==null){ synchronized (RetrofitUtils.class){ if(retrofitUtils==null){ retrofitUtils=new RetrofitUtils(); } } } return retrofitUtils; } public ApiService getApi(){ ApiService apiService = retrofit.create(ApiService.class); return apiService; } private OkHttpClient getOkHttpClient() { //缓存路径 File cacheFile = new File(App.getContext().getCacheDir().getAbsolutePath(), "HttpCache"); Cache cache = new Cache(cacheFile, 1024 * 1024 * 10);//缓存文件为10MB OkHttpClient httpClient = new OkHttpClient.Builder() .addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { int maxAge = 60*60; // 有网络时 设置缓存超时时间1个小时 int maxStale = 60 * 60 * 24 * 28; // 无网络时,设置超时为4周 Request request = chain.request(); if (isNetworkReachable(App.getContext())) { request= request.newBuilder() .addHeader("apikey", "2ffc3e48c7086e0e1faa003d781c0e69") .cacheControl(CacheControl.FORCE_NETWORK)//有网络时只从网络获取 .build(); }else { request= request.newBuilder() .cacheControl(CacheControl.FORCE_CACHE)//无网络时只从缓存中读取 .build(); } Response response = chain.proceed(request); if (isNetworkReachable(App.getContext())) { response= response.newBuilder() .removeHeader("Pragma") .header("Cache-Control", "public, max-age=" + maxAge) .build(); } else { response= response.newBuilder() .removeHeader("Pragma") .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale) .build(); } return response; } }) .connectTimeout(6000, TimeUnit.SECONDS) .cache(cache) .build(); return httpClient; } public static Boolean isNetworkReachable(Context context) { ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo current = cm.getActiveNetworkInfo(); if (current == null) { return false; } return (current.isAvailable()); } }
创建ApiService接口
public interface ApiService { @GET Observable getData(@Url String url); }