Update: Beachten Sie, dass diese Antwort jetzt ziemlich unwirksam ist. Der Garbage Collector reagiert aggressiv auf SoftReference und WeakReference, daher ist dieser Code NICHT für neue Anwendungen geeignet. (Versuchen Sie stattdessen Bibliotheken wie Universal Image Loader in anderen Antworten vorgeschlagen).
Danke an James für den Code und an Bao-Long für den Vorschlag, SoftReference zu verwenden. Ich habe die SoftReference-Änderungen an James' Code implementiert. Leider führten SoftReferences dazu, dass meine Bilder zu schnell in den Müll wanderten. In meinem Fall ging es auch ohne SoftReference, weil meine Listengröße begrenzt ist und meine Bilder klein sind.
Es gibt eine Diskussion von vor einem Jahr über die SoftReferences auf Google Groups: Link zum Thema . Als Lösung für die zu frühe Garbage Collection schlagen sie die Möglichkeit vor, die Heap-Größe der VM mit dalvik.system.VMRuntime.setMinimumHeapSize() manuell einzustellen, was ich nicht sehr attraktiv finde.
public DrawableManager() {
drawableMap = new HashMap<String, SoftReference<Drawable>>();
}
public Drawable fetchDrawable(String urlString) {
SoftReference<Drawable> drawableRef = drawableMap.get(urlString);
if (drawableRef != null) {
Drawable drawable = drawableRef.get();
if (drawable != null)
return drawable;
// Reference has expired so remove the key from drawableMap
drawableMap.remove(urlString);
}
if (Constants.LOGGING) Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
try {
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
drawableRef = new SoftReference<Drawable>(drawable);
drawableMap.put(urlString, drawableRef);
if (Constants.LOGGING) Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
+ drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
+ drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
return drawableRef.get();
} catch (MalformedURLException e) {
if (Constants.LOGGING) Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
return null;
} catch (IOException e) {
if (Constants.LOGGING) Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
return null;
}
}
public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
SoftReference<Drawable> drawableRef = drawableMap.get(urlString);
if (drawableRef != null) {
Drawable drawable = drawableRef.get();
if (drawable != null) {
imageView.setImageDrawable(drawableRef.get());
return;
}
// Reference has expired so remove the key from drawableMap
drawableMap.remove(urlString);
}
final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
imageView.setImageDrawable((Drawable) message.obj);
}
};
Thread thread = new Thread() {
@Override
public void run() {
//TODO : set imageView to a "pending" image
Drawable drawable = fetchDrawable(urlString);
Message message = handler.obtainMessage(1, drawable);
handler.sendMessage(message);
}
};
thread.start();
}
13 Stimmen
Sie können verwenden GreenDroids AsyncImageView . Einfach anrufen
setUrl
.8 Stimmen
Ich habe es benutzt. Es ist eine wunderbare Umsetzung. Schlechte Nachricht, dass AsyncImageView ist ein Teil eines großen GreenDroid Projekt, das Ihre Anwendung größer machen, auch in dem Fall, alles, was Sie brauchen, ist AsyncImageView. Auch scheint, GreenDroid Projekt ist nicht seit 2011 aktualisiert.
6 Stimmen
Sie können diese Bibliothek auch einmal ausprobieren: Android-http-image-manager die meiner Meinung nach die beste Lösung für asynchrones Laden von Bildern ist.
36 Stimmen
Benutzen Sie einfach Picasso, es macht alles von selbst. Picasso.with(yourContext).load(img src/path/drawable here).into(imageView d.h. Ihr Ziel);' Das war's!
10 Stimmen
Versuchen Sie es mit : github.com/nostra13/Android-Universal-Image-Loader Diese Bibliothek ist sehr schnell und effizient für träges Laden und Bild-Caching
2 Stimmen
Verwenden Sie die Glide-Bildladebibliothek.