2016-10-31 5 views
1

私はアンドロイドアプリケーションでRetrofit2 &のOKHTTP3を使用しています。私の要求は、オフラインモードでアプリケーションを使用するための要求をキャッシュしなければならないことです。物事は、要求をキャッシュすることができます。しかし、ユーザーが再びオンラインになると、データはバックエンドから新しく取得されるべきであり、キャッシュされた応答を提供すべきではありません。どうすればこれを実現できますか?以下は私のネットワークインターセプタOkhttp3.0とretrofit2でネットワークリクエストをキャッシング

ネットワークインターセプタ

public class CachingInterceptor implements Interceptor { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 


      if (Util.isOnline()) { 
       request = request.newBuilder() 
         .header("Cache-Control", "only-if-cached") 
         .build(); 
      } else { 
       request = request.newBuilder() 
         .header("Cache-Control", "public, max-stale=2419200") 
         .build(); 
      } 

     Response response= chain.proceed(request); 
     return response.newBuilder() 
       .header("Cache-Control", "max-age=86400") 
       .build(); 
    } 
} 

答えて

0

がそれを手に入れました。デバイスがオフラインの場合、キャッシュコントロールヘッダーを"public、if-cached、max-stale = 86400"と設定しています(これは無効な時間を1日に設定します)。今デバイスがオンラインの場合、サーバーから新しく取り出されます。

OkHttpClient

okHttpClient = new OkHttpClient.Builder() 
      .addInterceptor(new OfflineCachingInterceptor()) 
      .cache(cache) 
      .build(); 

OfflineCachingInterceptor

public class OfflineCachingInterceptor implements Interceptor { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 

     Request request = chain.request(); 
     //Checking if the device is online 
     if (!(Util.isOnline())) { 
      // 1 day stale 
      int maxStale = 86400; 
      request = request.newBuilder() 
        .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale) 
        .build(); 
     } 

     return chain.proceed(request); 
    } 
} 
0

この回答link OkHttpインターセプタを参照してくださいされ、オフライン時にキャッシュにアクセスするための正しい方法である:

関連する問題