Maison > Java > javaDidacticiel > Comment utiliser les données mises en cache avec Retrofit et OKHttp hors ligne ?

Comment utiliser les données mises en cache avec Retrofit et OKHttp hors ligne ?

Mary-Kate Olsen
Libérer: 2024-11-04 14:20:02
original
795 Les gens l'ont consulté

 How to use cached data with Retrofit and OKHttp offline?

Retrofit avec OKHttp peut-il utiliser les données de cache en mode hors connexion

Lors de l'utilisation de Retrofit et OKHttp pour mettre en cache les réponses HTTP, des difficultés peuvent survenir. Examinons ce problème et sa solution :

Problème

Les utilisateurs peuvent ne pas parvenir à lire les réponses mises en cache hors ligne lorsqu'ils utilisent Retrofit avec OKHttp. Malgré la réponse JSON mise en cache, une UnknownHostException est renvoyée.

Solution

Pour résoudre ce problème, la réponse du serveur doit contenir Cache-Control: public pour activer OkClient pour accéder au cache.

De plus, vous pouvez modifier l'en-tête de la requête pour prioriser les connexions réseau lorsqu'elles sont accessibles en ajoutant Cache-Control : max-age=0.

Voici comment utiliser explicitement :

Pour Retrofit 2.x :

Utiliser un intercepteur pour gérer l'accès au cache :

<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

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

Pour OKHttp 2.0.x :

Mettez à jour le code pour refléter les changements dans la syntaxe :

<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);
        }
        String hostURL = context.getString(R.string.host_url);

        api = new RestAdapter.Builder()
                .setEndpoint(hostURL)
                // ...
                .build()
                .create(MyApi.class);</code>
Copier après la connexion

Autres considérations :

  • Supprimez l'en-tête Vary de la réponse pour vous assurer que toutes les méthodes HTTP sont mises en cache.
  • Si vous rencontrez toujours des problèmes, essayez de vider le cache et de redémarrer l'application.

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!

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