Ich verwende Picasso, um Bilder in meiner Android-App anzuzeigen:
/**
* load image.This is within a activity so this context is activity
*/
public void loadImage (){
Picasso picasso = Picasso.with(this);
picasso.setDebugging(true);
picasso.load(quiz.getImageUrl()).into(quizImage);
}
Ich habe das Debuggen aktiviert und es wird immer entweder rot oder grün angezeigt. Es wird jedoch nie gelb angezeigt
Wenn ich jetzt das nächste Mal dasselbe Bild lade und das Internet nicht verfügbar ist, wird das Bild nicht geladen.
Fragen:
- Hat es keinen lokalen Festplatten-Cache?
- Wie aktiviere ich das Festplatten-Caching, da ich dasselbe Image mehrmals verwenden werde?
- Muss ich der Android-Manifestdatei eine Festplattenberechtigung hinzufügen?
Antworten:
Das habe ich getan. Funktioniert gut.
Fügen Sie zuerst das OkHttp zur Gradle-Build-Datei des App-Moduls hinzu:
Dann machen Sie eine Klasse zu erweitern
Application
Fügen Sie es wie folgt zur Manifest-Datei hinzu:
Verwenden Sie jetzt Picasso wie gewohnt. Keine Änderungen.
BEARBEITEN:
Wenn Sie nur zwischengespeicherte Bilder verwenden möchten. Rufen Sie die Bibliothek so auf. Ich habe festgestellt, dass Bilder nicht vollständig offline angezeigt werden, wenn wir die networkPolicy nicht hinzufügen, selbst wenn sie zwischengespeichert werden . Der folgende Code löst das Problem.
EDIT # 2
Das Problem mit dem obigen Code besteht darin, dass Picasso beim Löschen des Caches weiterhin offline im Cache sucht und fehlschlägt. Das folgende Codebeispiel zeigt den lokalen Cache. Wenn er nicht offline gefunden wird, wird er online geschaltet und füllt den Cache auf.
quelle
okhttp3.OkHttpClient
Bibliothek müssen SieOkHttp3Downloader
Klassenform verwendencompile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
1) Antwort auf die erste Frage: gemäß Picasso Doc for With () -Methode
Der
Disk Cache
Betrieb für Global Default Picasso ist jedoch nur für API 14+ verfügbar2) Antwort der zweiten Frage:
Picasso
Die VerwendungHTTP
Client - Anfrage an denDisk Cache
Betrieb So können Sie Ihre eigene machenhttp request header
hat die EigenschaftCache-Control
mitmax-age
und erstellen Sie Ihre eigene statische Picasso Instanz statt Standard Picasso Durch die Verwendung von1] HttpResponseCache (Hinweis: Funktioniert nur für API 13+)
2] OkHttpClient (Funktioniert für alle APIs)
Beispiel für die
OkHttpClient
Erstellung einer eigenen statischen Picasso-Klasse:Erstellen Sie zuerst eine neue Klasse, um Ihr eigenes Singleton-
picasso
Objekt zu erhaltenVerwenden Sie
picasso
stattdessen Ihr eigenes Singleton- ObjektPicasso.With()
PicassoCache.getPicassoInstance(getContext()).load(imagePath).into(imageView)
3) Antwort auf die dritte Frage: Sie benötigen keine Festplattenberechtigungen für Festplatten-Cache-Vorgänge
Referenzen : Github-Problem mit dem Festplatten-Cache , zwei Fragen wurden von @ jake-wharton beantwortet -> Frage1 und Frage2
quelle
FATAL EXCEPTION: main java.lang.NoClassDefFoundError: com.squareup.okhttp.OkHttpClient
okhttp
Für das Caching würde ich OkHttp- Interceptors verwenden , um die Kontrolle über die Caching-Richtlinie zu erlangen. Schauen Sie sich dieses Beispiel an, das in der OkHttp-Bibliothek enthalten ist.
RewriteResponseCacheControl.java
So würde ich es mit Picasso verwenden -
quelle
Für die aktuellste Version 2.71828 Dies sind Ihre Antworten.
Q1 : Hat es keinen lokalen Festplatten-Cache?
A1 : In Picasso gibt es Standard-Caching, und der Anforderungsfluss ist genau so
Wo immer sie zuerst ihr Bild getroffen haben, verwenden sie dieses Bild und stoppen dann den Anforderungsfluss. Was ist mit dem Antwortfluss? Mach dir keine Sorgen, hier ist es.
Standardmäßig werden sie zuerst auf einer lokalen Festplatte für den erweiterten Aufbewahrungscache gespeichert. Dann der Speicher für die Instanznutzung des Caches.
Sie können die in Picasso integrierte Anzeige verwenden, um zu sehen, wo sich Bilder bilden, indem Sie diese Option aktivieren.
In der oberen linken Ecke Ihrer Bilder wird eine Flagge angezeigt.
F2 : Wie aktiviere ich das Festplatten-Caching, da ich dasselbe Image mehrmals verwenden werde?
A2 : Sie müssen es nicht aktivieren. Es ist die Standardeinstellung.
Sie müssen es deaktivieren , wenn Ihre Bilder immer frisch sein sollen. Es gibt zwei Möglichkeiten zum Deaktivieren des Caching.
.memoryPolicy()
auf no_cache und / oder NO_STORE und der Fluss wird so aussehen.NO_CACHE überspringt das Nachschlagen von Bildern aus dem Speicher.
NO_STORE überspringt beim ersten Laden von Bildern das Speichern von Bildern im Speicher.
.networkPolicy()
auf no_cache und / oder NO_STORE und der Fluss wird so aussehen.NO_CACHE überspringt das Nachschlagen von Bildern von der Festplatte.
NO_STORE überspringt beim ersten Laden von Bildern das Speichern von Bildern auf der Festplatte.
Sie können weder deaktivieren, um Bilder vollständig zwischenzuspeichern. Hier ist ein Beispiel.
Der Fluss ohne Caching und ohne Speicherung wird so aussehen.
Möglicherweise benötigen Sie dies, um auch die Nutzung Ihres App-Speichers zu minimieren.
Q3 : Muss ich der Android-Manifestdatei eine Festplattenberechtigung hinzufügen?
A3 : Nein, aber vergessen Sie nicht, die INTERNET-Berechtigung für Ihre HTTP-Anforderung hinzuzufügen.
quelle
1) Picasso hat standardmäßig einen Cache (siehe ahmed hamdy Antwort)
2) Wenn Sie wirklich ein Image aus dem Festplatten-Cache und dann aus dem Netzwerk nehmen müssen, empfehle ich, einen eigenen Downloader zu schreiben:
Und in Application Singleton in der Methode OnCreate verwenden Sie es mit picasso:
3) Für den Standard-Anwendungscache-Ordner sind keine Berechtigungen erforderlich
quelle
Fügen Sie folgenden Code hinzu
Application.onCreate
und verwenden Sie ihn dann normalWenn Sie zuerst Bilder zwischenspeichern, machen Sie so etwas in
ProductImageDownloader.doBackground
und laden Sie Ihre Bilder wie gewohnt oder mit Festplatten-Caching
Hinweis:
Die rote Farbe zeigt an, dass das Bild aus dem Netzwerk abgerufen wird .
Die grüne Farbe zeigt an, dass das Bild aus dem Cache-Speicher abgerufen wird .
Die blaue Farbe zeigt an, dass das Bild aus dem Festplattenspeicher abgerufen wird .
Vor dem Loslassen der App löschen oder einstellen
false
picasso.setLoggingEnabled(true);
,picasso.setIndicatorsEnabled(true);
falls nicht erforderlich. Dankequelle
Ich weiß nicht, wie gut diese Lösung ist, aber es ist definitiv DIE EINFACHE, die ich gerade in meiner App verwendet habe, und sie funktioniert einwandfrei
Sie laden das Bild so
Sie können das bekommen
bimap
wie dieVerstecken Sie das nun
Bitmap
in eineJPG
Datei und speichern Sie es im Cache. Unten finden Sie den vollständigen Code zum Abrufen und Zwischenspeichern der BimapDie
get()
Methode von musstePiccasso
aus irgendeinem Grund in einem separaten Thread aufgerufen werden. Ich speichere das Bild auch in demselben Thread.Sobald das Bild gespeichert ist, können Sie alle Dateien so erhalten
Jetzt finden Sie die gesuchte Datei wie folgt
quelle
Ich benutze diesen Code und habe gearbeitet, vielleicht nützlich für Sie:
quelle
Ich hatte das gleiche Problem und benutzte stattdessen die Glide-Bibliothek. Der Cache ist dort sofort einsatzbereit. https://github.com/bumptech/glide
quelle