Retrofit 2.0+okhttp 3キャッシュポリシー

3631 ワード

概要
  • Retrofit自体はキャッシュされていませんが、キャッシュ機能を設定するにはhttpクライアント層でHTTPの意味を知る必要があります.
  • okhttpは、キャッシュ・サーバの応答の意味をサポートするsquare社が発表したHTTPクライアントです.
  • 使用シーン:ユーザー体験を向上させ、サーバの負荷を低減します.ネットワークがない場合、キャッシュを読み出す.ネットワーク条件の下で、非リアルタイム性のデータに対して所定の時間の中でキャッシュを読み取ることができて、例えば時間を60 sに設定して、リアルタイム性のデータはやはり毎回最新のデータを取得します.

  • 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();