Retrofit+RxJava+缓存代码

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);
}

猜你喜欢

转载自blog.csdn.net/qq_42749901/article/details/81161865
今日推荐