需要导入的相关库
retorfit_version = "2.3.0" retorfit_jackson_version = "2.1.0" retorfit_coroutines_version = "0.9.2" kotlinCoroutineVersion = "1.0.1"
Retrofit2 : "com.squareup.retrofit2:retrofit:$retorfit_version", Retrofit2Moshi : "com.squareup.retrofit2:converter-moshi:$rootProject.retorfit_version", Retrofit2coroutines : "com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:$retorfit_coroutines_version", Retrofit2Jackson:"com.squareup.retrofit2:converter-gson:$retorfit_jackson_version",
由于Retorfit2的拦截器是引用之Ok3 所以要导入以下包
implementation 'com.squareup.okhttp3:okhttp:3.4.1' //日志的拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1' implementation 'com.squareup.okhttp3:mockwebserver:3.4.1'
package com.nova.omnipotentlib.activity.http; import android.content.Context; import androidx.annotation.NonNull; import com.franmontiel.persistentcookiejar.ClearableCookieJar; import com.franmontiel.persistentcookiejar.PersistentCookieJar; import com.franmontiel.persistentcookiejar.cache.SetCookieCache; import com.franmontiel.persistentcookiejar.persistence.SharedPrefsCookiePersistor; import com.nova.omnipotentlib.BuildConfig; 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 okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class RetrofitFactory { static Context mContext; 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(mContext)) {// NetWorkUtil.isNetworkConnected(mContext) 判断网络请求 request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build(); } Response originalResponse = chain.proceed(request); if (NetWorkUtil.isNetworkConnected(mContext)) { // 有网络时 设置缓存为默认值 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; //这个人函数供外部调用,当请求数据时来调用 @NonNull public static Retrofit getRetrofit() { synchronized (Object) { if (retrofit == null) { // 指定缓存路径,缓存大小 50Mb Cache cache = new Cache(new File("/sdcard/", "HttpCache"), 1024 * 1024 * 50); // 三方 Cookie 持久化 //maven { url "https://jitpack.io" } //compile 'com.github.franmontiel:PersistentCookieJar:v1.0.1' ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(mContext)); 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 = new SDKManager().initInterceptor(builder); } retrofit = new Retrofit.Builder() .baseUrl("www.baidu.com")// .client(builder.build()) .addConverterFactory(GsonConverterFactory.create()) //.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } return retrofit; } } public static class SDKManager { // public void initStetho(Context context){ // Stetho.initializeWithDefaults(context); // } /** * okhttp 3 日志拦截 * @param builder * @return */ public OkHttpClient.Builder initInterceptor(OkHttpClient.Builder builder){ HttpLoggingInterceptor interceptor=new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); builder.addInterceptor(interceptor); return builder; } } // static class HttpLoggingInterceptor implements Interceptor { // // @Override // public Response intercept(Chain chain) throws IOException { // return null; // } // // // public void setLevel(){ // // } // } }
自行设置对应参数即可