218 lines
8.7 KiB
Plaintext
218 lines
8.7 KiB
Plaintext
|
package com.novelbook.android.utils;
|
|||
|
|
|||
|
import android.content.Context;
|
|||
|
import android.util.Log;
|
|||
|
|
|||
|
import com.novelbook.android.BuildConfig;
|
|||
|
import com.novelbook.android.MyApp;
|
|||
|
|
|||
|
import java.io.File;
|
|||
|
import java.io.IOException;
|
|||
|
import java.net.URLDecoder;
|
|||
|
import java.util.ArrayList;
|
|||
|
import java.util.HashMap;
|
|||
|
import java.util.concurrent.TimeUnit;
|
|||
|
|
|||
|
import io.reactivex.annotations.NonNull;
|
|||
|
import okhttp3.Cache;
|
|||
|
import okhttp3.CacheControl;
|
|||
|
import okhttp3.Interceptor;
|
|||
|
import okhttp3.OkHttpClient;
|
|||
|
import okhttp3.Request;
|
|||
|
import okhttp3.Response;
|
|||
|
import okhttp3.logging.HttpLoggingInterceptor;
|
|||
|
|
|||
|
import retrofit2.Retrofit;
|
|||
|
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
|
|||
|
import retrofit2.converter.gson.GsonConverterFactory;
|
|||
|
|
|||
|
public class RetrofitFactory {
|
|||
|
|
|||
|
private static final Object Object = new Object();
|
|||
|
/**
|
|||
|
* 缓存机制
|
|||
|
* 在响应请求之后在 data/data/<包名>/cache 下建立一个response 文件夹,保持缓存数据。
|
|||
|
* 这样我们就可以在请求的时候,如果判断到没有网络,自动读取缓存的数据。
|
|||
|
* 同样这也可以实现,在我们没有网络的情况下,重新打开App可以浏览的之前显示过的内容。
|
|||
|
* 也就是:判断网络,有网络,则从网络获取,并保存到缓存中,无网络,则从缓存中获取。
|
|||
|
* https://werb.github.io/2016/07/29/%E4%BD%BF%E7%94%A8Retrofit2+OkHttp3%E5%AE%9E%E7%8E%B0%E7%BC%93%E5%AD%98%E5%A4%84%E7%90%86/
|
|||
|
*/
|
|||
|
//这里是设置拦截器,供下面的函数调用,辅助作用。
|
|||
|
private static final Interceptor cacheControlInterceptor = new Interceptor() {
|
|||
|
@Override
|
|||
|
public Response intercept(Chain chain) throws IOException {
|
|||
|
Request request = chain.request();
|
|||
|
if (!NetWorkUtil.isNetworkConnected(MyApp.applicationContext)) {
|
|||
|
request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
|
|||
|
}
|
|||
|
|
|||
|
Response originalResponse = chain.proceed(request);
|
|||
|
if (NetWorkUtil.isNetworkConnected(MyApp.applicationContext)) {
|
|||
|
// 有网络时 设置缓存为默认值
|
|||
|
String cacheControl = request.cacheControl().toString();
|
|||
|
return originalResponse.newBuilder()
|
|||
|
.header("Cache-Control", cacheControl)
|
|||
|
.removeHeader("Pragma") // 清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效
|
|||
|
.build();
|
|||
|
} else {
|
|||
|
// 无网络时 设置超时为1周
|
|||
|
int maxStale = 60 * 60 * 24 * 7;
|
|||
|
return originalResponse.newBuilder()
|
|||
|
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
|
|||
|
.removeHeader("Pragma")
|
|||
|
.build();
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
private volatile static Retrofit retrofit;
|
|||
|
|
|||
|
private static String baseUrl ="https://api.douban.com/v2/movie/";
|
|||
|
//这个人函数供外部调用,当请求数据时来调用
|
|||
|
@NonNull
|
|||
|
public static Retrofit getRetrofit() {
|
|||
|
synchronized (Object) {
|
|||
|
if (retrofit == null) {
|
|||
|
// 指定缓存路径,缓存大小 50Mb
|
|||
|
Cache cache = new Cache(new File(MyApp.applicationContext.getCacheDir(), "HttpCache"),1024 * 1024 * 50);
|
|||
|
|
|||
|
// Cookie 持久化
|
|||
|
// ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(MyApp.applicationContext));
|
|||
|
|
|||
|
OkHttpClient.Builder builder = new OkHttpClient.Builder()
|
|||
|
// .cookieJar(cookieJar)
|
|||
|
.cache(cache)
|
|||
|
.addInterceptor(cacheControlInterceptor)
|
|||
|
.connectTimeout(10, TimeUnit.SECONDS)
|
|||
|
.readTimeout(15, TimeUnit.SECONDS)
|
|||
|
.writeTimeout(15, TimeUnit.SECONDS)
|
|||
|
.retryOnConnectionFailure(true);
|
|||
|
|
|||
|
// Log 拦截器
|
|||
|
if (BuildConfig.DEBUG) {
|
|||
|
builder = initInterceptor(builder);
|
|||
|
}
|
|||
|
|
|||
|
retrofit = new Retrofit.Builder()
|
|||
|
.baseUrl(baseUrl)
|
|||
|
.client(builder.build())
|
|||
|
.addConverterFactory(GsonConverterFactory.create())
|
|||
|
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
|
|||
|
.build();
|
|||
|
}
|
|||
|
return retrofit;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public static OkHttpClient.Builder initInterceptor(OkHttpClient.Builder builder){
|
|||
|
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
|
|||
|
@Override
|
|||
|
public void log(String message) {
|
|||
|
try {
|
|||
|
String text = URLDecoder.decode(message, "utf-8");
|
|||
|
Log.e("OKHttp-----", text);
|
|||
|
} catch ( Exception e) {
|
|||
|
e.printStackTrace();
|
|||
|
Log.e("OKHttp-----", message);
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
|
|||
|
builder.addInterceptor(interceptor);
|
|||
|
|
|||
|
|
|||
|
// 添加公共参数拦截器
|
|||
|
/* BasicParamsInterceptor basicParamsInterceptor = new BasicParamsInterceptor.Builder()
|
|||
|
.addHeaderParam("userName","")//添加公共参数
|
|||
|
.addHeaderParam("device","")
|
|||
|
.build();
|
|||
|
|
|||
|
builder.addInterceptor(basicParamsInterceptor);*/
|
|||
|
|
|||
|
|
|||
|
/* // 添加公共参数拦截器
|
|||
|
HttpCommonInterceptor commonInterceptor = new HttpCommonInterceptor.Builder()
|
|||
|
.addHeaderParams("paltform","android")
|
|||
|
.addHeaderParams("userToken","1234343434dfdfd3434")
|
|||
|
.addHeaderParams("userId","123445")
|
|||
|
.build();
|
|||
|
builder.addInterceptor(commonInterceptor);*/
|
|||
|
|
|||
|
|
|||
|
return builder;
|
|||
|
}
|
|||
|
}
|
|||
|
/*
|
|||
|
|
|||
|
public class HttpCommonInterceptor implements Interceptor{
|
|||
|
private Map<string,string> mHeaderParamsMap = new HashMap<>();
|
|||
|
Map<string, string=""> queryParamsMap = new HashMap<>();
|
|||
|
Map<string, string=""> paramsMap = new HashMap<>();
|
|||
|
Map<string, string=""> headerParamsMap = new HashMap<>();
|
|||
|
List<string> headerLinesList = new ArrayList<>();
|
|||
|
public HttpCommonInterceptor() {
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public Response intercept(Chain chain) throws IOException {
|
|||
|
Log.d("HttpCommonInterceptor","add common params");
|
|||
|
Request oldRequest = chain.request();
|
|||
|
// Request request = chain.request();
|
|||
|
Headers.Builder headerBuilder = oldRequest.headers().newBuilder();
|
|||
|
Request.Builder requestBuilder = oldRequest.newBuilder();
|
|||
|
|
|||
|
// 添加新的参数,添加到url 中
|
|||
|
*/
|
|||
|
/* HttpUrl.Builder authorizedUrlBuilder = oldRequest.url()
|
|||
|
.newBuilder()
|
|||
|
.scheme(oldRequest.url().scheme())
|
|||
|
.host(oldRequest.url().host());*//*
|
|||
|
|
|||
|
|
|||
|
if (headerParamsMap.size() > 0) {
|
|||
|
Iterator iterator = headerParamsMap.entrySet().iterator();
|
|||
|
while (iterator.hasNext()) {
|
|||
|
Map.Entry entry = (Map.Entry) iterator.next();
|
|||
|
headerBuilder.add((String) entry.getKey(), (String) entry.getValue());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (headerLinesList.size() > 0) {
|
|||
|
for (String line: headerLinesList) {
|
|||
|
headerBuilder.add(line);
|
|||
|
}
|
|||
|
requestBuilder.headers(headerBuilder.build());
|
|||
|
}
|
|||
|
|
|||
|
// 新的请求
|
|||
|
|
|||
|
//Request.Builder requestBuilder = oldRequest.newBuilder();
|
|||
|
requestBuilder.method(oldRequest.method(), oldRequest.body());
|
|||
|
//添加公共参数,添加到header中
|
|||
|
if(mHeaderParamsMap.size() > 0){
|
|||
|
for(Map.Entry<string,string> params:mHeaderParamsMap.entrySet()){
|
|||
|
requestBuilder.header(params.getKey(),params.getValue());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// process post body inject
|
|||
|
if (paramsMap.size() > 0) {
|
|||
|
if (canInjectIntoBody(oldRequest)) {
|
|||
|
FormBody.Builder formBodyBuilder = new FormBody.Builder();
|
|||
|
for(Map.Entry<string, string=""> entry : paramsMap.entrySet()) {
|
|||
|
formBodyBuilder.add((String) entry.getKey(), (String) entry.getValue());
|
|||
|
}
|
|||
|
|
|||
|
RequestBody formBody = formBodyBuilder.build();
|
|||
|
String postBodyString = bodyToString(oldRequest.body());
|
|||
|
postBodyString += ((postBodyString.length() > 0) ? "&" : "") + bodyToString(formBody);
|
|||
|
requestBuilder.post(RequestBody.create(MediaType.parse("application/x-www-form-urlencoded;charset=UTF-8"), postBodyString));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Request newRequest = requestBuilder.build();
|
|||
|
|
|||
|
return chain.proceed(newRequest);
|
|||
|
}*/
|