Retrofit 2.0+okhttp 3キャッシュポリシー
3631 ワード
概要 Retrofit自体はキャッシュされていませんが、キャッシュ機能を設定するにはhttpクライアント層でHTTPの意味を知る必要があります. okhttpは、キャッシュ・サーバの応答の意味をサポートするsquare社が発表したHTTPクライアントです. 使用シーン:ユーザー体験を向上させ、サーバの負荷を低減します.ネットワークがない場合、キャッシュを読み出す.ネットワーク条件の下で、非リアルタイム性のデータに対して所定の時間の中でキャッシュを読み取ることができて、例えば時間を60 sに設定して、リアルタイム性のデータはやはり毎回最新のデータを取得します.
Retrofit管理クラスのカプセル化
HttpCacheInterceptorクラス
ネットワークがある場合max-age=60、すなわち1分を設定する.ネットワークがない場合はmax-stale=60 x 60 x 24 x 28、つまり4週間設定します.
okhttp 3のCacheクラスに含まれるキャッシュポリシー
NoCache:キャッシュを使用せず、すべてネットワークを移動noStore:キャッシュを使用しない、キャッシュも保存しないonlyIfCached:キャッシュmaxAgeのみ使用:最大失効時間を設定し、失効したらmaxStaleを使用しない:最大失効時間を設定し、失効したらminFreshを使用しない:最小有効時間を設定し、失効したらFORCEを使用しないNETWORK:強制ネットワークFORCE_CACHE:キャッシュを強制する
単一インタフェース設定キャッシュ
上記はすべて統合設定キャッシュで、Retrofitは単一のインタフェースにキャッシュを設定することもできます.単一リクエストの@Headersを構成し、このリクエストのキャッシュポリシーが他のリクエストのキャッシュポリシーに影響しないように設定し、設定しないとキャッシュされません.
//単一リクエストのキャッシュ時間を設定@Headers("Cache-Control:max-age=640000")@GET("user/list")Call>getList();
個々のインタフェースの@Headers構成の読み込み
String cacheControl = request.cacheControl().toString(); response.newBuilder() .header("Cache-Control", cacheControl) .removeHeader("Pragma") .build();
Retrofit管理クラスのカプセル化
public class RetrofitManger {
private static RetrofitManger mInstance;
public static boolean isDebug = false;
public static synchronized RetrofitManger getInstance() {
if (mInstance == null)
mInstance = new RetrofitManger();
return mInstance;
}
public void deBug(boolean isDebug) {
this.isDebug = isDebug;
}
// create retrofit singleton
private Retrofit createApiClient(String baseUrl) {
return new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(createOkHttpClient(isDebug))
.build();
}
// create okHttpClient singleton
OkHttpClient createOkHttpClient(boolean debug) {
// 100M
Cache cache = new Cache(new File(MainApplication.getContext().getCacheDir(),"httpCache"),1024 * 1024 * 100);
return new OkHttpClient.Builder()
.cache(cache)
.addNetworkInterceptor(new HttpCacheInterceptor())
.addInterceptor(
new HttpLoggingInterceptor().setLevel(
debug ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE))
.build();
}
}
HttpCacheInterceptorクラス
public class HttpCacheInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (!NetWorkHelper.isNetConnected(MainApplication.getContext())) {
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
}
Response response = chain.proceed(request);
if (NetWorkHelper.isNetConnected(MainApplication.getContext())) {
int maxAge = 60; // read from cache for 1 minute
response.newBuilder()
.removeHeader("Pragma")
.header("Cache-Control", "public, max-age=" + maxAge)
.build();
} else {
int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
response.newBuilder()
.removeHeader("Pragma")
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
.build();
}
return response;
}
}
ネットワークがある場合max-age=60、すなわち1分を設定する.ネットワークがない場合はmax-stale=60 x 60 x 24 x 28、つまり4週間設定します.
okhttp 3のCacheクラスに含まれるキャッシュポリシー
NoCache:キャッシュを使用せず、すべてネットワークを移動noStore:キャッシュを使用しない、キャッシュも保存しないonlyIfCached:キャッシュmaxAgeのみ使用:最大失効時間を設定し、失効したらmaxStaleを使用しない:最大失効時間を設定し、失効したらminFreshを使用しない:最小有効時間を設定し、失効したらFORCEを使用しないNETWORK:強制ネットワークFORCE_CACHE:キャッシュを強制する
単一インタフェース設定キャッシュ
上記はすべて統合設定キャッシュで、Retrofitは単一のインタフェースにキャッシュを設定することもできます.単一リクエストの@Headersを構成し、このリクエストのキャッシュポリシーが他のリクエストのキャッシュポリシーに影響しないように設定し、設定しないとキャッシュされません.
//単一リクエストのキャッシュ時間を設定@Headers("Cache-Control:max-age=640000")@GET("user/list")Call>getList();
個々のインタフェースの@Headers構成の読み込み
String cacheControl = request.cacheControl().toString(); response.newBuilder() .header("Cache-Control", cacheControl) .removeHeader("Pragma") .build();