Maison > Java > javaDidacticiel > La mise à niveau avec OKHttp peut-elle utiliser les données mises en cache hors ligne ?

La mise à niveau avec OKHttp peut-elle utiliser les données mises en cache hors ligne ?

Patricia Arquette
Libérer: 2024-11-04 20:01:02
original
770 Les gens l'ont consulté

Can Retrofit with OKHttp Use Cached Data Offline?

Peut-on utiliser Retrofit avec OKHttp pour mettre en cache les données en mode hors ligne ?

Cette question explore l'utilisation de Retrofit et OKHttp pour mettre en cache les réponses HTTP pour un accès hors ligne. Le code fourni dans la question suit une approche courante, mais l'incapacité de récupérer les réponses mises en cache hors ligne suggère que certaines configurations supplémentaires sont nécessaires.

Modifier pour Retrofit 2.x

Pour Retrofit 2.x, la méthode préférée pour la mise en cache hors ligne implique l'utilisation d'un OkHttp Intercepteur.

  1. Créer un intercepteur :

    <code class="java">private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
        @Override public Response intercept(Chain chain) throws IOException {
            Response originalResponse = chain.proceed(chain.request());
            if (Utils.isNetworkAvailable(context)) {
                int maxAge = 60; // read from cache for 1 minute
                return originalResponse.newBuilder()
                        .header("Cache-Control", "public, max-age=" + maxAge)
                        .build();
            } else {
                int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
                return originalResponse.newBuilder()
                        .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                        .build();
            }
        }
    };</code>
    Copier après la connexion
  2. Configurer le client :

    <code class="java">OkHttpClient client = new OkHttpClient();
    client.networkInterceptors().add(REWRITE_CACHE_CONTROL_INTERCEPTOR);
    
    //setup cache
    File httpCacheDirectory = new File(context.getCacheDir(), "responses");
    int cacheSize = 10 * 1024 * 1024; // 10 MiB
    Cache cache = new Cache(httpCacheDirectory, cacheSize);
    
    //add cache to the client
    client.setCache(cache);</code>
    Copier après la connexion
  3. Ajouter un client à mise à niveau

    <code class="java">Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build();</code>
    Copier après la connexion

OKHttp 2.0.x (réponse originale)

Dans OKHttp 2.0.x, la méthode setResponseCache est désormais setCache :

<code class="java">File httpCacheDirectory = new File(context.getCacheDir(), "responses");

Cache cache = null;
try {
   cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);
} catch (IOException e) {
   Log.e("OKHttp", "Could not create http cache", e);
}

OkHttpClient okHttpClient = new OkHttpClient();
if (cache != null) {
   okHttpClient.setCache(cache);
}</code>
Copier après la connexion

Réponse originale

La réponse originale souligne la nécessité d'un en-tête Cache-Control: public dans la réponse du serveur pour qu'OkClient puisse accéder au cache données hors ligne.

De plus, la configuration d'en-tête paramétrée peut être réalisée à l'aide d'un RequêteIntercepteur :

<code class="java">RestAdapter.Builder builder= new RestAdapter.Builder()
   .setRequestInterceptor(new RequestInterceptor() {
        @Override
        public void intercept(RequestFacade request) {
            request.addHeader("Accept", "application/json;versions=1");
            if (MyApplicationUtils.isNetworkAvailable(context)) {
                int maxAge = 60; // read from cache for 1 minute
                request.addHeader("Cache-Control", "public, max-age=" + maxAge);
            } else {
                int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
                request.addHeader("Cache-Control", 
                    "public, only-if-cached, max-stale=" + maxStale);
            }
        }
});</code>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal