2016-05-26 2 views
0

Ich versuche Caching meiner Anfrage zu tun. Zur Nachrüstung 2 Scheinbar muss ich dafür nicht OKHttp verwenden. Wie kann ich dann cachen? Ich versuche so:Retrofit 2.0.2: wie Cache-GET-Anfrage?

private static Retrofit.Builder builder = new Retrofit.Builder() 
      .baseUrl(BASE_URL /*+ API*/) 
      .cache(new Cache(App.sApp.getCacheDir(), 10 * 1024 * 1024)) // 10 MB 
      .addInterceptor(new Interceptor() { 
       @Override public Response intercept(Chain chain) throws IOException { 
        Request request = chain.request(); 
        if (ApiUtils.isNetworkAvailable()) { 
         request = request.newBuilder().header("Cache-Control", "public, max-age=" + 60).build(); 
        } else { 
         request = request.newBuilder().header("Cache-Control", "public, only-if-cached, max-stale=" + 60 * 60 * 24 * 7).build(); 
        } 
        return chain.proceed(request); 
       } 
      }) 
      .addConverterFactory(GsonConverterFactory.create(getGson())); 

Aber es ist nicht passiert.

Antwort

1

Ich fand OkClientFactory von Retrofit2 Demo in GDGAhmedabad Repo

Vielleicht wird es Ihnen hilft.

.client(App.getInstance().getOkHttpClient()) 

here Siehe für mehr

Danke:

public class OkClientFactory { 
    // Cache size for the OkHttpClient 

    private static final int DISK_CACHE_SIZE = 50 * 1024 * 1024; // 50MB 

    private OkClientFactory() { 
    } 

    @NonNull 
    public static OkHttpClient provideOkHttpClient(Application app) { 
     // Install an HTTP cache in the application cache directory. 
     File cacheDir = new File(app.getCacheDir(), "http"); 
     Cache cache = new Cache(cacheDir, DISK_CACHE_SIZE); 

     OkHttpClient.Builder builder = new OkHttpClient.Builder() 
       .cache(cache); 
     if (BuildConfig.DEBUG) { 
      HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); 
      loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
      builder.interceptors().add(loggingInterceptor); 
     } 
     return builder.build(); 
    } } 

Jetzt können Sie wie verwenden.

0

Sie müssen angeben, dass nur GET-Anforderungen zwischengespeichert werden sollen.

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

    // Add Cache Control only for GET methods 
    if (request.method().equals("GET")) { 
     if (ConnectivityUtil.checkConnectivity(getContext())) { 
      // 1 day 
      request = request.newBuilder() 
       .header("Cache-Control", "only-if-cached") 
       .build(); 
     } else { 
      // 4 weeks stale 
      request = request.newBuilder() 
       .header("Cache-Control", "public, max-stale=2419200") 
       .build(); 
     } 
    } 

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