2016-09-12 6 views
0

APIレスポンスの基本的なキャッシングを実装する必要があります。私はGitHub APIを呼び出し、キャッシュが成功した小さな遊び場プロジェクトを作った(私はそれを検証するためにCharlesを使いました)。しかし、このソリューションを私のターゲットプロジェクトに移したときに、キャッシングはもはや機能しませんでした。チェーン内の複数のインターセプタが理由である可能性がありますか?2キャッシング - インターセプタのチェーン

遊び場プロジェクトからコード(作業):

インターセプター(ターゲットプロジェクトのために同じ):

public class CacheControlInterceptor implements Interceptor { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Response response = chain.proceed(chain.request()); 
     return response.newBuilder() 
       .header("Cache-Control", "only-if-cached") 
       .build(); 
    } 
} 

キャッシュとクライアントの宣言:CacheControlInterceptorのデバッグから

long SIZE_OF_CACHE = 10 * 1024 * 1024; // 10 MB 
final Cache cache = new Cache(new File(getCacheDir(), "retrofit_cache"), SIZE_OF_CACHE); 

OkHttpClient.Builder client = new OkHttpClient.Builder().cache(cache); 
client.networkInterceptors().add(new CacheControlInterceptor()); 

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl("https://api.github.com/users/") 
     .addConverterFactory(GsonConverterFactory.create()) 
     .client(client.build()) 
     .build(); 

画面: screen

ターゲットプロジェクト(動作しない)からは


コード:

キャッシュとクライアントの宣言:CacheControlInterceptorのデバッグから

private OkHttpClient provideOkHttpClient() { 
    HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); 
    loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

    OkHttpClient.Builder okhttpClientBuilder = new OkHttpClient.Builder(); 
    okhttpClientBuilder.connectTimeout(30, TimeUnit.SECONDS); 
    okhttpClientBuilder.readTimeout(30, TimeUnit.SECONDS); 
    okhttpClientBuilder.writeTimeout(30, TimeUnit.SECONDS); 

    okhttpClientBuilder.addInterceptor(loggingInterceptor); 
    okhttpClientBuilder.addInterceptor(new JwtRenewInterceptor(getUserSession())); 
    okhttpClientBuilder.addInterceptor(new AutoLoginInterceptor(getUserSession())); 
    okhttpClientBuilder.addNetworkInterceptor(new CacheControlInterceptor()); 

    long SIZE_OF_CACHE = 10 * 1024 * 1024; // 10 MB 
    final Cache cache = new Cache(new File(getCacheDir(), "retrofit_cache"), SIZE_OF_CACHE); 
    okhttpClientBuilder.cache(cache); 

    return okhttpClientBuilder.build(); 
} 

画面:あなたがするためにいくつかのヘッダーを適用したい場合はscreen

答えて

0

を試してみてください。 addHeaderまたはheaderという方法では、単にCache-Controlというキーを追加し、次にonly-if-cachedの値を追加すると考えました。しかし、それは価値だけを追加します!私のターゲットプロジェクトのAPIには、Cache-Control(GitHub APIと違って)というヘッダキーがなかったので、値only-if-cachedを格納する場所がありませんでした。

1

OkHttpキャッシュを使用するすべてのリクエストでは、ネットワークインターセプタではなくApplicationインターセプタを使用する必要があります。それ以外の場合は、キャッシュメカニズムにキャッシュされた応答を返す機会を与えていません。 素敵なので、おそらく何あなたのコード内で起こっていることは、キャッシュに行くリクエストがonly-if-cachedヘッダーが不足しているので、あなたが回答を保存するためにCacheを聞かせていますが、それらを使用しないということですOkHttpウィキ enter image description here

に示されています。

は実際に間違いがHTTPヘッダについての私の貧弱な推論によって引き起こされた okhttpClientBuilder.addInterceptor(new CacheControlInterceptor());

関連する問題