Android cache d'image
Comment puis-je mettre en cache les images après les avoir téléchargés à partir du web?
Vous devez vous connecter pour publier un commentaire.
Comment puis-je mettre en cache les images après les avoir téléchargés à partir du web?
Vous devez vous connecter pour publier un commentaire.
Et maintenant le mot de la fin: utilisation du système de cache.
Fournit à la fois la mémoire et flash-rom cache, partagé avec le navigateur.
grr. Je souhaite que quelqu'un M'avait dit qu'avant, j'ai écrit mon propre gestionnaire de cache.
connection.getContent()
retourne toujours un InputStream pour moi, ce que je fais mal?Bitmap response = BitmapFactory.decodeStream((InputStream)connection.getContent());
Object data = connection.getContent()
ouInputStream inputStream = connection.getInputStream()
Concernant l'élégant
connection.setUseCaches
solution ci-dessus: malheureusement, il ne fonctionne pas sans quelques efforts supplémentaires. Vous aurez besoin d'installer unResponseCache
à l'aide deResponseCache.setDefault
. Sinon,HttpURLConnection
silencieusement ignorer lasetUseCaches(true)
peu.Voir le commentaire en haut de
FileResponseCache.java
pour plus de détails:http://libs-for-android.googlecode.com/svn/reference/com/google/android/filecache/FileResponseCache.html
(J'aimerais l'afficher dans un commentaire, mais j'ai n'ont apparemment pas assez pour le karma.)
HttpResponseCache
, vous pourriez trouver laHttpResponseCache.getHitCount()
retourne 0. Je ne suis pas sûr mais je pense que c'est parce que le serveur web que vous demandez ne pas utiliser la mise en cache des en-têtes dans ce cas. Pour faire de la mise en cache de toute façon, utiliserconnection.addRequestProperty("Cache-Control", "max-stale=" + MAX_STALE_CACHE);
.Les convertir en images bitmap, puis de les stocker dans une Collection(HashMap,Liste, etc.) ou vous pouvez les écrire sur la carte sd.
Lors de leur stockage dans l'espace des applications à l'aide de la première approche, vous pouvez les envelopper autour d'un java.lang.réf.SoftReference spécifiquement si leur nombre est grand (de sorte qu'ils sont des ordures collectées pendant la crise). Cela pourrait s'ensuivre une recharge bien.
écrire sur SDcard n'aurez pas besoin de Recharger, il suffit d'un utilisateur l'autorisation.
Utilisation
LruCache
pour mettre en cache les images de manière efficace. Vous pouvez lire à ce sujetLruCache
de Développeur Android siteJ'ai utilisé ci-dessous une solution pour les Images de téléchargement et de la mise en cache dans android. Vous pouvez suivre les étapes ci-dessous:
ÉTAPE 1:
faire Classe Nommée
ImagesCache
. J'ai utiliséSingleton object for this class
ÉTAPE 2:
faire une autre classe nommée DownloadImageTask qui est utilisé si l'image bitmap n'est pas disponible dans le cache, il va le télécharger ici:
ÉTAPE 3: Utilisation de votre
Activity
ouAdapter
Remarque: Si vous voulez charger une image à partir de l'url à partir de
Activity
Classe. Utiliser le deuxième Constructeur deDownloadImageTask
, mais si vous voulez afficher une image à partirAdapter
utiliser le premier Constructeur deDownloadImageTask
(par exemple vous avez une image dansListView
et vous êtes réglage de l'image à partir de la 'Carte')L'UTILISATION DE L'ACTIVITÉ:
UTILISATION DE L'ADAPTATEUR:
Remarque:
cache.initializeCache()
vous pouvez utiliser cette instruction dans la première Activité de votre application. Une fois que vous avez initialisé la cache vous n'aurez jamais besoin de initialisé à chaque fois si vous utilisezImagesCache
instance.Je ne suis pas douée pour expliquer les choses, mais espérons que cela aidera les débutants que la façon de mettre en cache en utilisant
LruCache
et de son utilisation 🙂EDIT:
Maintenant un jours il y a des très célèbres bibliothèques connu comme
Picasso
etGlide
qui peut être utilisé pour charger des images de manière très efficace dans l'application android. Essayez cette très simple et utile bibliothèque Picasso pour android et De Glisse Pour Android. Vous n'avez pas besoin de s'inquiéter à propos de cache des images.Vous pouvez également visiter le blog pour la différence entre la Glisse et Picasso
LruCache
a paire clé-valeur et à chaque fois que vous avez obtenir l'url de l'imagegetImage()
télécharger l'image à partir de l'url. L'Url de l'image serontkey
deLruCache
et Bitmap sera la valeur et si vous regardez de plus près àDownloadImageTask
vous pouvez définirdesiredWidth
etdesiredHeight
valeur le moindre largeur et la hauteur que vous définissez la qualité d'image inférieure, vous verrez.Basically you check the bounds of the image first, and if they are bigger than we want, you call the function inside again
Oui, parce que si l'image n'est pas jusqu'à la taille que nous voulons, puis augmenterinSampleSize
et appeler la fonction à nouveau (fonction récursive faire). C'est tout simplement parce que chaque fois que vous augmentezinSampleSize
, il demande le décodeur pour sous-échantillonner l'image d'origine, en renvoyant une image plus petite pour économiser de la mémoire. Vous pouvez lire sur ceinsampleSize
faire à partir de ce lien developer.android.com/reference/android/graphics/...if(cache == null)
qui a résolu mon problème! 🙂Usage from activity
partie et unNote
au-dessus d'elle.LruCache
a paire clé-valeur et chaque url de l'image est défini comme clé dans le cache et ses téléchargé bitmap en tant que valeur, donc Si vous voulez renouveler certaines url, vous devriez vous rappeler que l'url que vous souhaitez renouveler et puis il suffit de chercher dansLruCache
avec cette clé, et les remplacer par de nouveaux url avec cette cléImagesCache
classe au-dessus. Il contient des fonctions que vous pouvez ajouter plus de fonctions que vous souhaitez au moment de l'exécution de cette classe de cache.key
et le contenu des images sontvalue
, pour renouveler l'image dans le cache je dois être, par exemple, ajoutermilisecond
fin de l'url commeURL/google.jpg?timestamp=TIMESTAMP
, puis l'image clé queimage url
changé et après la demande de nouveau que téléchargé à nouveau et de mettre en cache enLruCache
. ok?getImageFromWareHouse
devrait êtregetImageFromWarehouse
De télécharger une image et l'enregistrer sur la carte mémoire vous pouvez le faire comme ceci.
N'oubliez pas d'ajouter le Internet autorisation à votre manifeste:
Je voudrais envisager d'utiliser droidfu de l'image cache. Il met en œuvre à la fois une mémoire et un disque d'images en fonction de cache. Vous bénéficiez également d'un WebImageView qui tire parti de la ImageCache bibliothèque.
Voici la description complète de droidfu et WebImageView:
http://brainflush.wordpress.com/2009/11/23/droid-fu-part-2-webimageview-and-webgalleryadapter/
J'ai essayé SoftReferences, ils sont trop agressivement récupérée dans android que j'ai ressenti il n'y a pas de point à l'aide de leur
SoftReference
s. Ils recommandent d'utiliser leurLruCache
à la place.Comme le Tonnerre Lapin suggéré, ImageDownloader est le meilleur pour le job. J'ai aussi trouvé une légère variation de la classe à:
http://theandroidcoder.com/utilities/android-image-download-and-caching/
La principale différence entre les deux est que la ImageDownloader utilise le Android système de mise en cache, et la modification de l'une des utilisations internes et externes de stockage que la mise en cache, en gardant en mémoire cache des images indéfiniment ou jusqu'à ce que l'utilisateur supprime manuellement. L'auteur mentionne également Android 2.1 compatibilité.
C'est une bonne prise de Joe. L'exemple de code ci-dessus a deux problèmes - l'un - l'objet de la réponse n'est pas une instance de Bitmap (quand mon URL fait référence à un format jpg, comme http:\website.com\image.jpg ses
org.apache.l'harmonie.luni.interne.net.www.le protocole.http.HttpURLConnectionImpl$LimitedInputStream).
Seconde, comme Joe points, pas de mise en cache se produit sans une réponse de cache est configuré. Les développeurs Android sont à lancer leur propre cache. Voici un exemple pour le faire, mais il ne cache dans la mémoire, ce qui n'est vraiment pas la solution complète.
http://codebycoffee.com/2010/06/29/using-responsecache-in-an-android-app/
La URLConnection la mise en cache de l'API est décrite ici:
http://download.oracle.com/javase/6/docs/technotes/guides/net/http-cache.html
Je pense toujours que c'est un OK de la solution d'aller dans cette voie - mais vous devez écrire un cache. Il semble amusant, mais je préfère écrire des fonctions.
Il y a une entrée spéciale sur la formation officielle de la section d'Android à ce sujet: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
La section est tout à fait nouveau, il n'était pas là lorsque la question a été posée.
La solution proposée est d'utiliser un LruCache. Cette catégorie a été introduite en Nid d'abeille, mais il est également inclus dans la bibliothèque de compatibilité.
Vous pouvez initialiser un LruCache en définissant le nombre maximal d'entrées et il sera automatiquement trier votre vous et nettoyez-les moins utilisés lorsque vous dépassez la limite. Autre que cela, il est utilisé comme normal Map.
L'exemple de code à partir de la page officielle:
Précédemment SoftReferences sont une bonne alternative, mais pas plus, en citant la page officielle:
Envisager d'utiliser Image Universelle de Chargeur de la bibliothèque par Sergey Tarasevich. Il est livré avec:
Image universelle de Chargeur permet de détail de la gestion du cache pour les images téléchargées, avec les configurations de cache:
UsingFreqLimitedMemoryCache
: Le moins fréquemment utilisé bitmap est supprimé lorsque la taille du cache de la limite est dépassée.LRULimitedMemoryCache
: Le moins récemment utilisé bitmap est supprimé lorsque la taille du cache de la limite est dépassée.FIFOLimitedMemoryCache
: Le FIFO règle est utilisée pour la suppression, lorsque la taille du cache de la limite est dépassée.LargestLimitedMemoryCache
: Le plus bitmap est supprimé lorsque la taille du cache de la limite est dépassée.LimitedAgeMemoryCache
: L'objet mis en Cache est supprimé lorsque son âge dépasse la valeur définie.WeakMemoryCache
: Une mémoire cache avec seulement de faibles références à des bitmaps.Un simple exemple d'utilisation:
Cet exemple utilise la valeur par défaut
UsingFreqLimitedMemoryCache
.Ce qui a fonctionné pour moi a été mise en ResponseCache sur ma classe Principale:
et
lors du téléchargement de l'image.
http://practicaldroid.blogspot.com/2013/01/utilizing-http-response-cache.html
Google libs-pour-android a une belle bibliothèques pour la gestion de l'image et le fichier cache.
http://code.google.com/p/libs-for-android/
J'avais lutté avec pendant un certain temps, et les réponses à l'aide de SoftReferences de perdre leurs données trop rapidement. Les réponses suggèrent que l'instanciation d'un RequestCache étaient trop salissant, en plus je n'ai jamais pu trouver un exemple complet.
Mais ImageDownloader.java fonctionne à merveille pour moi. Il utilise une table de hachage jusqu'à ce que la capacité soit atteint ou jusqu'à ce que la purge du délai d'attente se produit, alors les choses se déplacé à un SoftReference, utilisant ainsi le meilleur des deux mondes.
Je suggère ALLUMAGE c'est encore mieux que Droid fu
https://github.com/kaeppler/ignition
https://github.com/kaeppler/ignition/wiki/Sample-applications
Même plus tard de réponse, mais j'ai écrit un Android Image Manager qui gère la mise en cache transparente (mémoire et disque). Le code est sur Github https://github.com/felipecsl/Android-ImageManager
Réponse tardive, mais j'ai pensé que je devrais ajouter un lien vers mon site parce que j'ai écrit un tutoriel comment faire une image cache pour android:
http://squarewolf.nl/2010/11/android-image-cache/mise à Jour: la page a été pris hors de la source, est dépassée. Je rejoins @elenasys dans ses conseils pour utiliser Allumage.Donc, pour tous ceux qui trébuchent sur cette question et n'ai pas trouvé une solution: j'espère que vous apprécierez! =D