J'utilise un ListView
pour afficher certaines images et légendes associées à ces images. Je reçois les images d'Internet. Existe-t-il un moyen de charger des images paresseusement, alors pendant que le texte s'affiche, l'interface utilisateur n'est pas bloquée et les images sont affichées lors du téléchargement?
Le nombre total d'images n'est pas fixe.
setUrl
.Réponses:
Voici ce que j'ai créé pour contenir les images que mon application affiche actuellement. Veuillez noter que l'objet "Log" utilisé ici est mon wrapper personnalisé autour de la classe Log finale dans Android.
la source
LRU Cache
developer.android.com/training/displaying-bitmaps/…J'ai fait une démo simple d'une liste paresseuse (située sur GitHub) avec des images.
Cela peut être utile à quelqu'un. Il télécharge des images dans le fil d'arrière-plan. Les images sont mises en cache sur une carte SD et en mémoire. L'implémentation du cache est très simple et suffit juste pour la démo. Je décode les images avec inSampleSize pour réduire la consommation de mémoire. J'essaie également de gérer correctement les vues recyclées.
la source
Je recommande un instrument open source Universal Image Loader . Il est à l'origine basé sur le projet LazyList de Fedor Vlasov et a été considérablement amélioré depuis lors.
la source
Multithreading pour la performance , un tutoriel de Gilles Debunne.
Cela vient du blog des développeurs Android. Le code suggéré utilise:
AsyncTasks
.FIFO cache
.garbage collect
cache installer.Drawable
pendant que vous téléchargez.la source
Mise à jour: Notez que cette réponse est assez inefficace maintenant. Le Garbage Collector agit agressivement sur SoftReference et WeakReference, donc ce code n'est PAS adapté aux nouvelles applications. (Essayez plutôt des bibliothèques comme Universal Image Loader suggérées dans d'autres réponses.)
Merci à James pour le code et à Bao-Long pour la suggestion d'utiliser SoftReference. J'ai implémenté les changements de SoftReference sur le code de James. Malheureusement, SoftReferences a fait que mes images ont été récupérées trop rapidement. Dans mon cas, c'était bien sans le truc SoftReference, car la taille de ma liste est limitée et mes images sont petites.
Il y a une discussion il y a un an concernant les SoftReferences sur les groupes Google: lien vers le fil . Comme solution à la récupération de place trop précoce, ils suggèrent la possibilité de définir manuellement la taille du tas de machine virtuelle à l'aide de dalvik.system.VMRuntime.setMinimumHeapSize (), ce qui n'est pas très intéressant pour moi.
la source
Picasso
Utilisez la bibliothèque Picasso de Jake Wharton. (Une bibliothèque Perfect ImageLoading du développeur d'ActionBarSherlock)
Une puissante bibliothèque de téléchargement et de mise en cache d'images pour Android.
Les images ajoutent le contexte et le flair visuel indispensables aux applications Android. Picasso permet un chargement d'image sans tracas dans votre application, souvent sur une seule ligne de code!
De nombreux pièges courants du chargement d'images sur Android sont gérés automatiquement par Picasso:
Gestion du recyclage d'ImageView et annulation du téléchargement dans un adaptateur. Transformations d'images complexes avec une utilisation minimale de la mémoire. Mémoire automatique et mise en cache du disque.
Bibliothèque de Picasso Jake Wharton
Glide
Glide est un cadre de gestion des médias open source rapide et efficace pour Android qui englobe le décodage des médias, la mise en cache de la mémoire et du disque et la mise en commun des ressources dans une interface simple et facile à utiliser.
Glide prend en charge la récupération, le décodage et l'affichage d'images fixes vidéo, d'images et de GIF animés. Glide comprend une API flexible qui permet aux développeurs de se connecter à presque n'importe quelle pile réseau. Par défaut, Glide utilise une pile basée sur HttpUrlConnection personnalisée, mais inclut également des bibliothèques d'utilitaires connectées au projet Volley de Google ou à la bibliothèque OkHttp de Square à la place.
L'objectif principal de Glide est de rendre le défilement de toute sorte d'une liste d'images aussi fluide et rapide que possible, mais Glide est également efficace dans presque tous les cas où vous devez récupérer, redimensionner et afficher une image distante.
Bibliothèque de chargement d'images Glide
Fresque par Facebook
Fresco est un système puissant pour afficher des images dans des applications Android.
Fresco s'occupe du chargement et de l'affichage des images, vous n'avez donc pas à le faire. Il chargera les images du réseau, du stockage local ou des ressources locales et affichera un espace réservé jusqu'à ce que l'image soit arrivée. Il a deux niveaux de cache; un en mémoire et un autre en stockage interne.
Fresco Github
Dans Android 4.x et versions antérieures, Fresco place les images dans une région spéciale de la mémoire Android. Cela permet à votre application de s'exécuter plus rapidement et de souffrir beaucoup moins de la redoutable OutOfMemoryError.
Documentation Fresco
la source
Chargeur haute performance - après avoir examiné les méthodes suggérées ici, j'ai utilisé la solution de Ben avec quelques modifications -
J'ai réalisé que travailler avec des drawables est plus rapide qu'avec des bitmaps, donc j'utilise des drawables à la place
L'utilisation de SoftReference est excellente, mais cela rend l'image mise en cache à supprimer trop souvent, j'ai donc ajouté une liste liée qui contient des références d'images, empêchant l'image à supprimer, jusqu'à ce qu'elle atteigne une taille prédéfinie
Pour ouvrir InputStream, j'ai utilisé java.net.URLConnection qui me permet d'utiliser le cache Web (vous devez d'abord définir un cache de réponse, mais c'est une autre histoire)
Mon code:
la source
import java.util.Map; import java.util.HashMap; import java.util.LinkedList; import java.util.Collections; import java.util.WeakHashMap; import java.lang.ref.SoftReference; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import android.graphics.drawable.Drawable; import android.widget.ImageView; import android.os.Handler; import android.os.Message; import java.io.InputStream; import java.net.MalformedURLException; import java.io.IOException; import java.net.URL; import java.net.URLConnection;
J'ai suivi cette formation Android et je pense qu'elle fait un excellent travail pour télécharger des images sans bloquer l'interface utilisateur principale. Il gère également la mise en cache et traite le défilement de nombreuses images: Chargement efficace de grandes images bitmap
la source
1. Picasso permet un chargement d'image sans tracas dans votre application, souvent sur une seule ligne de code!
Utilisez Gradle:
Une seule ligne de code!
2. Glide Une bibliothèque de chargement et de mise en cache d'images pour Android axée sur un défilement fluide
Utilisez Gradle:
// Pour une vue simple:
3. fresco est un système puissant pour afficher des images dans les applications Android.Fresco s'occupe du chargement et de l'affichage des images, vous n'avez donc pas à le faire.
Premiers pas avec Fresco
la source
J'ai écrit un tutoriel qui explique comment effectuer un chargement paresseux d'images dans une vue de liste. J'entre dans les détails des problèmes de recyclage et de concurrence. J'utilise également un pool de threads fixe pour éviter de générer beaucoup de threads.
Chargement d'images paresseux dans le didacticiel Listview
la source
Pour ce faire, je lance un fil de discussion pour télécharger les images en arrière-plan et je lui donne un rappel pour chaque élément de la liste. Lorsqu'une image a fini de télécharger, elle appelle le rappel qui met à jour la vue de l'élément de liste.
Cependant, cette méthode ne fonctionne pas très bien lorsque vous recyclez les vues.
la source
Je veux juste ajouter un autre bon exemple, les adaptateurs XML . Comme il est utilisé par Google et j'utilise également la même logique pour éviter une erreur OutOfMemory.
Fondamentalement, ce ImageDownloader est votre réponse (car il couvre la plupart de vos besoins). Vous pouvez également en mettre en œuvre.
la source
Il s'agit d'un problème courant sur Android qui a été résolu de nombreuses manières par de nombreuses personnes. À mon avis, la meilleure solution que j'ai vue est la bibliothèque relativement nouvelle appelée Picasso . Voici les faits saillants:
Jake Wharton
des ActionBarSherlock renommée.ListView
Détection automatiquela source
J'utilise NetworkImageView de la nouvelle bibliothèque Android Volley
com.android.volley.toolbox.NetworkImageView
, et cela semble fonctionner assez bien. Apparemment, c'est la même vue que celle utilisée dans Google Play et d'autres nouvelles applications Google. Vaut vraiment le détour.Tutoriel Google I / O 2013 Volley Cache Cache
Développeurs Google events
la source
Eh bien, le temps de chargement des images à partir d'Internet a de nombreuses solutions. Vous pouvez également utiliser la bibliothèque Android-Query . Il vous donnera toute l'activité requise. Assurez-vous de ce que vous voulez faire et lisez la page wiki de la bibliothèque. Et résolvez la restriction de chargement d'image.
Voici mon code:
Cela devrait résoudre votre problème de chargement paresseux.
la source
Je pense que ce problème est très populaire parmi les développeurs Android, et il existe de nombreuses bibliothèques de ce type qui prétendent résoudre ce problème, mais seulement quelques-unes d'entre elles semblent être sur la bonne voie. AQuery est une de ces bibliothèques, mais elle est meilleure que la plupart d'entre elles dans tous les aspects et mérite d'être essayée.
la source
Vous devez essayer ce chargeur universel est le meilleur. J'utilise ceci après avoir fait de nombreux RnD sur le chargement paresseux.
Chargeur d'images universel
Caractéristiques
Prise en charge d'Android 2.0+
la source
Jetez un œil au Shutterbug , le port léger SDWebImage d'Applidium (une belle bibliothèque sur iOS) pour Android. Il prend en charge la mise en cache asynchrone, stocke les URL ayant échoué, gère bien la concurrence et des sous-classes utiles sont incluses.
Les demandes de tirage (et les rapports de bogues) sont également les bienvenus!
la source
DroidParts a ImageFetcher qui ne nécessite aucune configuration pour commencer.
Clone DroidPartsGram pour un exemple:
la source
Juste un petit conseil pour quelqu'un qui est indécis quant à la bibliothèque à utiliser pour les images à chargement paresseux:
Il existe quatre méthodes de base.
DIY => Pas la meilleure solution mais pour quelques images et si vous voulez vous passer des tracas d'utilisation d'autres bibliothèques
La bibliothèque de chargement paresseux de Volley => De gars sur Android. Il est beau et tout mais est mal documenté et est donc un problème à utiliser.
Picasso: Une solution simple qui fonctionne, vous pouvez même spécifier la taille exacte de l'image que vous souhaitez apporter. Elle est très simple à utiliser mais peut ne pas être très "performante" pour les applications qui doivent traiter des quantités énormes d'images.
UIL: La meilleure façon de charger des images paresseuses. Vous pouvez mettre en cache des images (vous avez bien sûr besoin d'une autorisation), initialiser le chargeur une fois, puis faire faire votre travail. La bibliothèque de chargement d'images asynchrones la plus mature que j'ai jamais vue jusqu'à présent.
la source
Novoda possède également une excellente bibliothèque de chargement d'images paresseuses et de nombreuses applications comme Songkick, Podio, SecretDJ et ImageSearch utilisent leur bibliothèque.
Leur bibliothèque est hébergée ici sur Github et ils ont également un tracker de problèmes assez actif . Leur projet semble également être assez actif, avec plus de 300+ commits au moment de la rédaction de cette réponse.
la source
Vérifiez ma fourchette de LazyList . Fondamentalement, j'améliore la LazyList en retardant l'appel de l'ImageView et crée deux méthodes:
J'ai également amélioré ImageLoader en implémentant un singleton dans cet objet.
la source
Si vous souhaitez afficher la disposition Shimmer comme Facebook, il existe une bibliothèque Facebook officielle pour cela. FaceBook Shimmer Android
Il s'occupe de tout, il vous suffit de mettre votre code de conception souhaité de manière imbriquée dans un cadre chatoyant. Voici un exemple de code.
Et voici le code java pour cela.
Ajoutez cette dépendance dans votre fichier gradle.
Voici à quoi ça ressemble.
la source
Tous les codes ci-dessus ont leur propre valeur, mais avec mon expérience personnelle, essayez simplement avec Picasso.
Picasso est une bibliothèque spécialement conçue à cet effet, en fait, elle gère automatiquement le cache et toutes les autres opérations réseau.Vous devrez ajouter une bibliothèque dans votre projet et écrire une seule ligne de code pour charger l'image à partir de l'URL distante.
Veuillez visiter ici: http://code.tutsplus.com/tutorials/android-sdk-working-with-picasso--cms-22149
la source
Utilisez la bibliothèque glide. Cela a fonctionné pour moi et fonctionnera également pour votre code. Cela fonctionne aussi bien pour les images que pour les gifs.
la source
Je peux recommander une manière différente qui fonctionne comme un charme: Android Query.
Vous pouvez télécharger ce fichier JAR ici
Par exemple:
C'est très rapide et précis, et en utilisant cela, vous pouvez trouver de nombreuses autres fonctionnalités comme l'animation lors du chargement, l'obtention d'une image bitmap (si nécessaire), etc.
la source
Essayez Aquery . Il a des méthodes incroyablement simples pour charger et mettre en cache des images de manière asynchrone.
la source
URLImageViewHelper est une bibliothèque incroyable qui vous aide à le faire.
la source
la source
J'ai eu ce problème et j'ai implémenté lruCache. Je pense que vous avez besoin de l'API 12 et supérieure ou utilisez la bibliothèque de compatibilité v4. lurCache est une mémoire rapide, mais elle a également un budget, donc si vous avez peur de pouvoir utiliser un cache de disque ... Tout est décrit dans Caching Bitmaps .
Je vais maintenant fournir mon implémentation qui est un singleton que j'appelle de n'importe où comme ceci:
Voici le code idéal pour mettre en cache, puis appelez ce qui précède dans getView d'un adaptateur lors de la récupération de l'image Web:
la source