2017-11-24 11 views
0

異なるキャッシュタイムを異なるエンドポイントに設定する必要がありますが、そのベストプラクティスは何ですか?Retrofit 2 - 異なるエンドポイントに動的キャッシュ時間を設定する方法

これは私のレトロフィット・インターフェースです:

public interface ServerApi { 

@GET("a1")// need to get 10 mintuns cache time 
Observable<A1> getA1(); 

@GET("a2")// need to get 20 mintuns cache time 
Observable<A2> getA2(); 

@GET("a3")// need to get 30 mintuns cache time 
Observable<A3> getA3(); 

は、これは私のネットワーククラスです:

public class Network { 
Network() { 
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
    logging.setLevel(HttpLoggingInterceptor.Level.BASIC); 
    OkHttpClient okHttpClient = new OkHttpClient.Builder() 
      .addNetworkInterceptor(logging) 
      .build(); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BuildConfig.BASE_URL) 
      .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .client(okHttpClient) 
      .build(); 

    retrofit.create(ServerApi.class); 
}} 

答えて

1

サーバーが正しいのCache-Controlヘッダを提供する場合。 OkHttpがキャッシュを処理します。

あなたのレトロフィットクライアント

int cacheSize = 10 * 1024 * 1024; 
Cache cache = new Cache(app.getCacheDir(), cacheSize); 

ビルドOkHttpクライアントの初期化キャッシュに、何らかの理由で、あなたのサーバがcache-を提供していない場合はキャッシュ

OkHttpClient client = new OkHttpClient.Builder() 
      // Add cache 
      .cache(cache) 
      .build(); 

ビルドレトロフィット

Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(baseUrl) 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory 
        .createWithScheduler(Schedulers.newThread())) 
      // Add OkHttp client 
      .client(client) 
      .build(); 

を提供ヘッダー。要求インターセプタを常にハードコードし、クライアント側でキャッシュヘッダを追加することができます。

あなたはおそらく、これらのいくつかの組み合わせ使用することができます:

Cache-Control: max-age=<seconds> 
Cache-Control: max-stale[=<seconds>] 

をしかし、あなたはそれを行うことにした場合、簡単な質問をします。有効期限を変更するとどうなりますか?あなたはおそらくいくつかの不要なコードを書くか、新しいAPKバージョンを出荷するでしょう。クールではありません。

幸運。

+1

は私のサーバーではないので、私はキャッシュ制御を制御できません。 これを行うにはハードコードインターフェイスに書き込む必要がありますか?アノテーションのヘッダー付きの ? @Headers( "Cache-Control:max-age = 640000") – Yoni

+0

まあ、それは依存しています。特定のキャッシング動作を要求するために、リクエストでキャッシュコントロールヘッダーを送信できますが、自分でテストし、サーバーがキャッシュコントロールヘッダーで応答するかどうかを確認する必要があります。そうでない場合は、レスポンスインターセプタを作成し、レスポンスを傍受して正しいヘッダーを添付する必要があります。 –

+0

私は今、それを確認します、ありがとう! – Yoni

関連する問題