2016-05-08 9 views
0

Ich arbeite an einer App mit vielen dynamischen und wechselnden Inhalten. Ich ziehe alle meine Daten von meinem Server, wenn die App geladen wird. Als Ergebnis wird fast jede Aktivität/jedes Fragment separat geladen, was dazu führt, dass der Benutzer viel Zeit darauf wartet, dass jede "Seite" einzeln geladen wird.Caching Bilder und Strings mit Retrofit, okhttp, picasso

Mein Ziel ist es, eine Lade-Seite zu erstellen, wenn die App gestartet wird, während für alle Downloads verantwortlich ist und alle Bilder und Informationen (Strings) zwischenspeichern und zum richtigen Zeitpunkt ziehen. (oder zumindest zu den meisten)

Ich hatte die Möglichkeit, Retrofit, Okhttp und Picasso als eine einzige zusätzliche Bibliothek zu verwenden, ich weiß aber, dass sie zusammenarbeiten und synchronisiert werden können, und dass Disk-Caching durch verfügbar ist mindestens zwei dieser Bibliotheken (picasso und okhttp) bin ich mir nicht sicher, aber welche soll welchen Teil machen und wie kann ich sie zusammen synchronisieren.

Ich werde jeden Tipp/Anleitung zu schätzen wissen, danke im Voraus.

Antwort

2

okhttp bietet Unterstützung für Cache Control Header. Ich habe sie in einer App implementiert, bevor Sie einen Cache zur Verfügung zu stellen, wenn das Netzwerk flockig ist mit this guide etwa so:

int cacheSize = 10 * 1024 * 1024; // 10 MiB 
Cache cache = new Cache(cacheDirectory, cacheSize); 

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

Als Retrofit verwendet okhttp intern (wenn Sie die neuesten mindestens verwenden), nicht wahr Konfigurieren Sie ein beliebiges Caching dafür. Verwenden Sie einfach die okhttp Client Sie gerade konfiguriert:

RestAdapter restAdapter = new RestAdapter.Builder() 
     .setClient(new OkClient(client)) 
     .setServer("http://example.com") 
     ... 
     .build(); 

Picasso Bilder automatisch zwischenspeichert einige Standard-Cache-Größenbegrenzung verwenden. Sie können Picassos Standard ändern, und ich habe einige Antworten here und here gefunden. Sie könnten die Cache-Größe in der onCreate Ihrer Anwendung einstellen:

Picasso.Builder builder = new Picasso.Builder(this); 
     builder.downloader(new OkHttpDownloader(this,Integer.MAX_VALUE)); 
     Picasso picasso = builder.build(); 
     picasso.setIndicatorsEnabled(true); 
     picasso.setLoggingEnabled(true); 
     Picasso.setSingletonInstance(picasso); 

Picasso können Sie auch Prefetch Bilder früher in Lebenszyklus einer App, wenn Sie die Zeit zu beginnen (zum Beispiel auf einem Ladebildschirm) und wollen um spätere Teile der App schneller laden zu können. Um dies zu tun, würde ich die fetch Methode aus dem Picasso Builder verwenden, um die Bilder zu erhalten, aber nicht in eine ImageViews einfügen. Sie können es auch Google, aber es gibt eine schnelle Antwort here, die den Hintergrund dahinter erklärt:

Picasso.with(getApplicationContext()) 
        .load(url) 
        .fetch(); 

IIRC müssen Sie sicherstellen, dass Sie die gleiche Größe und transformierte Bild holen, wie Sie versuchen und später wieder abrufen, weil Picasso-Caches das transformierte Bildergebnis und nicht das heruntergeladene Rohbild.

+0

Bitte nicht nur den ganzen Ort verlinken (besonders Artikel auf externen Seiten). Setzen Sie die relevanten Teile dieser externen Quellen als Zitate in Ihre Antwort ein. Auf diese Weise bleibt die Antwort auch dann gültig, wenn die externen Seiten heruntergefahren werden. –

+0

Danke! scheint genau das zu sein, was ich brauchte. Ich werde anfangen, es jetzt zu lesen. – Roee

+1

@LukasKnuth Recht, das war in meinem Kopf, als ich die Antwort schrieb, also werde ich es aktualisieren, aber alle Teile der Frage können durch verschiedene SO Antworten beantwortet werden. Es ist kein Duplikat, weil es keine andere Frage gibt, die dieselben Fragen zusammen stellt. Was ist also der Schaden, wenn man mit einer Reihe von SO-Links antwortet? Wenn SO heruntergefahren ist und die Links nicht verfügbar sind, können Sie diese Frage gar nicht erst aufrufen ... – roarster

Verwandte Themen