2016-07-12 4 views
2

zwischenspeichere Ich versuche, die http Antwort durch OKhttp zu cachen, aber nicht finden, ein gutes Beispiel oder eine Dokumentation.Wie man die Antwort im Quadratup.okhttp3

Vielen Dank für jede Hilfe

+0

Was wollen Sie tun? Ist nicht genug SharedPreferences? OK. Was ist mit dem Speichern in einer DB? –

+0

Ich benutze die Bibliothek von OK http. Ich möchte die HTTP-Antwort mit seiner Cache-Option zwischenspeichern. Also möchte ich wissen, welche Optionen dafür zur Verfügung stehen. –

+0

Hast du [dieses] (http://square.github.io/okhttp/3.x/okhttp/)? –

Antwort

2

all Ihre Antwort für 2 Minuten zwischengespeichert werden

OkHttpClient provideOkHttpClient() { 
    Cache cache = new Cache(new File(context.getCacheDir(), "http-cache"), 10 * 1024 * 1024); 
    return new OkHttpClient.Builder() 
      .addNetworkInterceptor(provideCacheInterceptor()) 
      .cache(cache) 
      .build(); 
} 

Interceptor provideCacheInterceptor() { 
    return new Interceptor() { 
     @Override 
     public Response intercept (Chain chain) throws IOException { 
      Response response = chain.proceed(chain.request()); 
      CacheControl cacheControl = new CacheControl.Builder() 
        .maxAge(2, TimeUnit.MINUTES) 
        .build(); 

      return response.newBuilder() 
        .header("Cache-Control", cacheControl.toString()) 
        .build(); 
     } 
    }; 
} 
2

Es gibt eine Probe hier CacheResponse.java

Cache cache = new Cache(cacheDirectory, cacheSize); 

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

Die javadoc for Cache Beispiele für zwingen frisch oder im Cache gespeichert hat, ist Antworten.

+0

Yuri es funktioniert, aber ich möchte Runtime-Speicher-Cache anstelle von Festplattenspeicher tun und möchte auch wissen, wie kann ich Cache weiter entfernen. Ich benutze den allgemeinen HTTP-Client hier. –

+0

Das Design von Cache basiert auf einem echten Dateisystem AFAIK. Es sieht nicht möglich durch öffentliche API aus. Ich vermute, Sie müssen entweder Cache mit einem Dateisystem verwenden oder implementieren Sie Ihre eigene Cache-Strategie in Interzeptoren –

3
public final class FeedInterceptor{ 
private final static String TAG = FeedInterceptor.class.getSimpleName(); 

/** 
* Validate cache, return stream. Return cache if no network. 
* @param context 
* @return 
*/ 
public static Interceptor getOnlineInterceptor(final Context context){ 
    Interceptor interceptor = new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Response response = chain.proceed(chain.request()); 

      String headers = response.header("Cache-Control"); 
      if(NetworkUtils.isConnected(context) && 
        (headers == null || headers.contains("no-store") || headers.contains("must-revalidate") || headers.contains("no-cache") || headers.contains("max-age=0"))){ 

       LOGD(TAG, "Returning fresh response"); 
       return response.newBuilder() 
         .header("Cache-Control", "public, max-age=600") 
         .build(); 
      } else{ 
       LOGD(TAG, "Returning old response"); 
       return response; 
      } 
     } 
    }; 

    return interceptor; 
} 

/** 
* Get me cache. 
* @param context 
* @return 
*/ 
public static Interceptor getOfflineInterceptor(final Context context){ 
    Interceptor interceptor = new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Request request = chain.request(); 
      if(!NetworkUtils.isConnected(context)){ 
       request = request.newBuilder() 
         .header("Cache-Control", "public, only-if-cached") 
         .build(); 
      } 

      return chain.proceed(request); 
     } 
    }; 

    return interceptor; 
} 

}

Und der Kunde:

private OkHttpClient createCacheClient(Context context){ 

    File httpCacheDirecotory = new File(context.getCacheDir(), FILE); 
    Cache cache = new Cache(httpCacheDirecotory, CACHE_SIZE); 

    return new OkHttpClient.Builder() 
      .addNetworkInterceptor(FeedInterceptor.getOnlineInterceptor(context)) 
      .addInterceptor(FeedInterceptor.getOfflineInterceptor(context)) 
      .cache(cache) 
      .build(); 
} 

Reference

+0

Funktioniert einfach. Sollte als akzeptiert markiert sein –

Verwandte Themen