onBitmapLoaded des Zielobjekts wurde beim ersten Laden nicht aufgerufen
In meiner Funktion :
public void getPointMarkerFromUrl(final String url, final OnBitmapDescriptorRetrievedListener listener) {
final int maxSize = context.getResources().getDimensionPixelSize(R.dimen.icon_max_size);
Target t = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
if (bitmap != null)
listener.bitmapRetrieved(getBitmapDescriptorInCache(url, bitmap));
else
loadDefaultMarker(listener);
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
loadDefaultMarker(listener);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
Picasso.with(context)
.load(url)
.resize(maxSize, maxSize)
.into(t);
}
Den onBitmapLoaded() wird niemals aufgerufen, das erste mal, dass ich Bilder laden. Ich habe einige Thema wie https://github.com/square/picasso/issues/39 was empfehlen Sie zu verwenden fetch-Target(t) - Methode (es scheint ein problem der schwachen Referenz...), aber diese Funktion ist nicht verfügbar in der letzten Version von picasso (2.3.2). Ich habe nur ein fetch () - Methode, aber ich kann in(mytarget) in der gleichen Zeit
Könnten Sie mir erklären, wie die Verwendung von fetch() mit einem benutzerdefinierten Ziel bitte ? Danke.
Doc : http://square.github.io/picasso/javadoc/com/squareup/picasso/RequestCreator.html#fetch--
InformationsquelleAutor der Frage psv | 2014-06-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie bereits von den anderen Befragten (@lukas und @mradzinski), Picasso hält nur einen schwachen Verweis auf die
Target
Objekt. Sie können zwar die store einen starken BezugTarget
in einer Ihrer Klassen, das kann immer problematisch sein, wenn dieTarget
verweist auf eineView
in irgendeiner Art und Weise, da Sie effektiv auch halten einen starken Hinweis auf, dassView
als auch aus (das ist eines der Dinge, die Picasso ausdrücklich hilft Ihnen zu vermeiden).Wenn Sie in dieser situation, würde ich empfehlen, Sie Kennzeichnen die
Target
zu denView
:Dieser Ansatz hat den Vorteil, dass Picasso handle alles für Sie. Sie verwaltet die
WeakReference
Objekte für jede der Ansichten - sobald man nicht mehr gebraucht, was auch immerTarget
Verarbeitung wird das Bild auch veröffentlicht werden, so dass Sie nicht stecken mit Speicherverlusten durch lange lebte Ziele, sondern Ihr Ziel wird so lange dauern, als sein Blick ist lebendig.InformationsquelleAutor der Antwort wrb
Picasso nicht halten eine starke Referenz auf das Ziel-Objekt, also es wird Müll gesammelt und onBitmapLoaded ist nicht genannt.
Die Lösung ist ziemlich einfach, juste stellen einen starken Bezug auf das Ziel.
InformationsquelleAutor der Antwort lukas
Hätte ich Bildansicht ich würde einfach machen wie diese: Bildansicht.setTag(Ziel);
Verwende ich folgende Lösung für das laden von Bitmaps in Benachrichtigungen, so brauche ich nur bitmap.
So erstellen Set Hexe wird Ziel speichern Objekte und entfernen Sie Sie auf fertig laden.
InformationsquelleAutor der Antwort Flinbor
InformationsquelleAutor der Antwort Raghav Satyadev
Wie @lukas sagte (und zu zitieren), Picasso nicht halten eine starke Referenz auf das Zielobjekt. Um zu vermeiden, garbage collection müssen Sie halten eine starke Referenz auf das Objekt.
Über die fetch () - Methode. Es ist ziemlich klar, in der Dokumentation, die fetch() nicht verwendet werden, mit einem Bildansicht noch ein Ziel, es ist einfach zu "warm" bis der cache und nichts anderes, so bist du nicht in der Lage sein, es zu benutzen, wie Sie wollen.
Ich empfehlen, halten Sie einen starken Bezug wie @lukas erklärt, sollte es funktionieren. Wenn nicht, öffnen Sie bitte ein neues Thema auf der GitHub-Seite des Projekts.
InformationsquelleAutor der Antwort mradzinski
Begegnete ich ähnlichen Problem und hält Referenz auf das Ziel-hat nicht geholfen, also ich habe folgende code gibt eine Bitmap:
auf der Seite nach unten -> es gibt keinen Rückruf und Sie können nicht rufen Sie diese Funktion auf dem Haupt-thread, die Sie zum ausführen dieser Funktion auf ein
hintergrund-thread, wie im folgenden Beispiel:
Andere Sache, das funktioniert viel besser, ist nur mit Glide!!
Brauchte ich beide nutzen, da der Zweck meines Projekts war der Einsatz von 2 verschiedenen Bild herunterladen, api um eine Bilder-Galerie und geben dem Benutzer die Möglichkeit zu entscheiden, welche api zu verwenden.
Ich muss sagen, ich war erstaunt von den Ergebnissen, die Glide - api funktioniert einwandfrei in jeder Hinsicht (Glide Ziel nicht über schwache Referenz) wile Picasso gab mir die Hölle (das war mein erstes mal mit Glide, ich in der Regel verwendet, Picasso so fern scheint wie heute, es ist gonna change ^^ ).
InformationsquelleAutor der Antwort Roee
Hier ist die Lösung für diejenigen, die nicht mit einem Blick. Diese helper-Methode verwendet eine Liste, um vorübergehend zu speichern, das Zielobjekt, bis ein Ergebnis zurückgegeben wird, so daß es nicht der gc würde:
InformationsquelleAutor der Antwort DroidT