Mise en cache d'images Android

141

Comment puis-je mettre en cache des images après leur téléchargement sur le Web?

d-man
la source

Réponses:

177

Et maintenant la punchline: utilisez le cache système.

URL url = new URL(strUrl);
URLConnection connection = url.openConnection();
connection.setUseCaches(true);
Object response = connection.getContent();
if (response instanceof Bitmap) {
  Bitmap bitmap = (Bitmap)response;
} 

Fournit à la fois de la mémoire et un cache flash-rom, partagés avec le navigateur.

grr. J'aurais aimé que quelqu'un ME dise cela avant d'écrire mon propre gestionnaire de cache.

Edrowland
la source
1
Wow, c'était une façon incroyablement élégante de le faire, merci beaucoup. Ce n'est en aucun cas plus lent que mon propre gestionnaire de cache simple, et maintenant je n'ai plus besoin de faire le ménage sur un dossier de carte SD.
Kevin a lu
11
connection.getContent()renvoie toujours un InputStream pour moi, qu'est-ce que je fais de mal?
Tyler Collier du
3
Si je pouvais maintenant aussi fixer une date d'expiration sur le contenu du cache, ma vie serait tellement plus facile :)
Janusz
11
@Scienceprodigy n'a aucune idée de ce qu'est ce BitmapLoader, ne figure certainement dans aucune bibliothèque Android standard que je connaisse, mais cela m'a au moins conduit dans la bonne direction. Bitmap response = BitmapFactory.decodeStream((InputStream)connection.getContent());
Stephen Fuhry
6
Assurez-vous de voir la réponse de Joe ci-dessous sur les étapes supplémentaires à suivre pour faire fonctionner le cache
Keith
65

En ce qui concerne la connection.setUseCachessolution élégante ci-dessus: malheureusement, cela ne fonctionnera pas sans un effort supplémentaire. Vous devrez installer un fichier ResponseCacheusing ResponseCache.setDefault. Sinon, HttpURLConnectionignorera silencieusement le setUseCaches(true)bit.

Voir les commentaires en haut de FileResponseCache.javapour plus de détails:

http://libs-for-android.googlecode.com/svn/reference/com/google/android/filecache/FileResponseCache.html

(Je publierais ceci dans un commentaire, mais je n'ai apparemment pas assez de karma SO.)

Joe
la source
Voici la fiche
Telémako
2
Lorsque vous utilisez un HttpResponseCache, vous pouvez trouver le HttpResponseCache.getHitCount()retour 0. Je ne suis pas sûr mais je pense que c'est parce que le serveur Web que vous demandez n'utilise pas les en-têtes de mise en cache dans ce cas. Pour que la mise en cache fonctionne de toute façon, utilisez connection.addRequestProperty("Cache-Control", "max-stale=" + MAX_STALE_CACHE);.
Almer
1
Le lien de recherche de codes Google est mort (encore?), Veuillez mettre à jour le lien.
Felix D.
De plus, je ne sais pas si ce problème est maintenant corrigé. Pour une raison quelconque, le retour de 304 depuis le serveur suspendrait HUC lors de l'utilisation de la .getContent()méthode car les réponses 304 n'ont pas de corps de réponse associé par la norme RFC.
TheRealChx101
27

Convertissez-les en bitmaps, puis stockez-les dans une collection (HashMap, liste, etc.) ou vous pouvez les écrire sur la carte SD.

Lorsque vous les stockez dans l'espace d'application en utilisant la première approche, vous voudrez peut-être les enrouler autour d'un java.lang.ref.SoftReference spécifiquement si leur nombre est grand (afin qu'ils soient ramassés pendant la crise). Cela pourrait cependant entraîner un rechargement.

HashMap<String,SoftReference<Bitmap>> imageCache =
        new HashMap<String,SoftReference<Bitmap>>();

les écrire sur la carte SD ne nécessitera pas de rechargement; juste une permission d'utilisateur.

Samuh
la source
comment pouvons-nous écrire une image sur la mémoire SD ou du téléphone?
d-man
Pour enregistrer des images sur la carte SD: Vous pouvez soit valider les flux d'images lus depuis le serveur distant dans la mémoire en utilisant les opérations d'E / S de fichier normales, soit si vous avez converti vos images en objets Bitmap, vous pouvez utiliser la méthode Bitmap.compress ().
Samuh
@ d-man Je suggère d'écrire d'abord sur le disque, puis d'obtenir une Uriréférence de chemin à laquelle vous pouvez passer ImageViewet d'autres vues personnalisées. Parce qu'à chaque fois compress, vous perdrez de la qualité. Bien sûr, cela n'est vrai que pour les algorithmes avec perte. Cette méthode vous permettrait également de stocker même un hachage du fichier et de l'utiliser la prochaine fois que vous demanderez le fichier au serveur via If-None-Matchet les en- ETagtêtes.
TheRealChx101
@ TheRealChx101 pourriez-vous s'il vous plaît aider à comprendre ce que vous voulez dire la prochaine fois que vous demandez le fichier au serveur via les en-têtes If-None-Match et ETag , je recherche essentiellement une approche de solution où l'image doit rester pour utiliser le cache local pour définir période OU si cela ne peut pas être réalisé, chaque fois que le contenu de l'URL est modifié, il doit être reflété dans l'application avec le dernier et le mettre en cache.
CoDe
@CoDe Visitez ce lien pour le moment, android.jlelse.eu
...
27

Utilisez LruCachepour mettre en cache les images efficacement. Vous pouvez lire à LruCachepartir de Android site développeur

J'ai utilisé la solution ci-dessous pour le téléchargement d'images et la mise en cache dans Android. Vous pouvez suivre les étapes ci-dessous:

ÉTAPE 1: créez la classe nommée ImagesCache. J'ai utiliséSingleton object for this class

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;

public class ImagesCache 
{
    private  LruCache<String, Bitmap> imagesWarehouse;

    private static ImagesCache cache;

    public static ImagesCache getInstance()
    {
        if(cache == null)
        {
            cache = new ImagesCache();
        }

        return cache;
    }

    public void initializeCache()
    {
        final int maxMemory = (int) (Runtime.getRuntime().maxMemory() /1024);

        final int cacheSize = maxMemory / 8;

        System.out.println("cache size = "+cacheSize);

        imagesWarehouse = new LruCache<String, Bitmap>(cacheSize)
                {
                    protected int sizeOf(String key, Bitmap value) 
                    {
                        // The cache size will be measured in kilobytes rather than number of items.

                        int bitmapByteCount = value.getRowBytes() * value.getHeight();

                        return bitmapByteCount / 1024;
                    }
                };
    }

    public void addImageToWarehouse(String key, Bitmap value)
    {       
        if(imagesWarehouse != null && imagesWarehouse.get(key) == null)
        {
            imagesWarehouse.put(key, value);
        }
    }

    public Bitmap getImageFromWarehouse(String key)
    {
        if(key != null)
        {
            return imagesWarehouse.get(key);
        }
        else
        {
            return null;
        }
    }

    public void removeImageFromWarehouse(String key)
    {
        imagesWarehouse.remove(key);
    }

    public void clearCache()
    {
        if(imagesWarehouse != null)
        {
            imagesWarehouse.evictAll();
        }       
    }

}

ÉTAPE 2:

créez une autre classe nommée DownloadImageTask qui est utilisée si le bitmap n'est pas disponible dans le cache, il le téléchargera à partir d'ici:

public class DownloadImageTask extends AsyncTask<String, Void, Bitmap>
{   
    private int inSampleSize = 0;

    private String imageUrl;

    private BaseAdapter adapter;

    private ImagesCache cache;

    private int desiredWidth, desiredHeight;

    private Bitmap image = null;

    private ImageView ivImageView;

    public DownloadImageTask(BaseAdapter adapter, int desiredWidth, int desiredHeight) 
    {
        this.adapter = adapter;

        this.cache = ImagesCache.getInstance();

        this.desiredWidth = desiredWidth;

        this.desiredHeight = desiredHeight;
    }

    public DownloadImageTask(ImagesCache cache, ImageView ivImageView, int desireWidth, int desireHeight)
    {
        this.cache = cache;

        this.ivImageView = ivImageView;

        this.desiredHeight = desireHeight;

        this.desiredWidth = desireWidth;
    }

    @Override
    protected Bitmap doInBackground(String... params) 
    {
        imageUrl = params[0];

        return getImage(imageUrl);
    }

    @Override
    protected void onPostExecute(Bitmap result) 
    {
        super.onPostExecute(result);

        if(result != null)
        {
            cache.addImageToWarehouse(imageUrl, result);

            if(ivImageView != null)
            {
                ivImageView.setImageBitmap(result);
            }
            else if(adapter != null)
            {
                adapter.notifyDataSetChanged();
            }
        }
    }

    private Bitmap getImage(String imageUrl)
    {   
        if(cache.getImageFromWarehouse(imageUrl) == null)
        {
            BitmapFactory.Options options = new BitmapFactory.Options();

            options.inJustDecodeBounds = true;

            options.inSampleSize = inSampleSize;

            try
            {
                URL url = new URL(imageUrl);

                HttpURLConnection connection = (HttpURLConnection)url.openConnection();

                InputStream stream = connection.getInputStream();

                image = BitmapFactory.decodeStream(stream, null, options);

                int imageWidth = options.outWidth;

                int imageHeight = options.outHeight;

                if(imageWidth > desiredWidth || imageHeight > desiredHeight)
                {   
                    System.out.println("imageWidth:"+imageWidth+", imageHeight:"+imageHeight);

                    inSampleSize = inSampleSize + 2;

                    getImage(imageUrl);
                }
                else
                {   
                    options.inJustDecodeBounds = false;

                    connection = (HttpURLConnection)url.openConnection();

                    stream = connection.getInputStream();

                    image = BitmapFactory.decodeStream(stream, null, options);

                    return image;
                }
            }

            catch(Exception e)
            {
                Log.e("getImage", e.toString());
            }
        }

        return image;
    }

ÉTAPE 3: Utilisation depuis votre ActivityouAdapter

Remarque: si vous souhaitez charger une image à partir de l'URL de ActivityClass. Utilisez le deuxième constructeur de DownloadImageTask, mais si vous souhaitez afficher l'image à partir du Adapterpremier constructeur de DownloadImageTask(par exemple, vous avez une image dans ListViewet vous définissez l'image à partir de 'Adapter')

UTILISATION DE L'ACTIVITÉ:

ImageView imv = (ImageView) findViewById(R.id.imageView);
ImagesCache cache = ImagesCache.getInstance();//Singleton instance handled in ImagesCache class.
cache.initializeCache();

String img = "your_image_url_here";

Bitmap bm = cache.getImageFromWarehouse(img);

if(bm != null)
{
  imv.setImageBitmap(bm);
}
else
{
  imv.setImageBitmap(null);

  DownloadImageTask imgTask = new DownloadImageTask(cache, imv, 300, 300);//Since you are using it from `Activity` call second Constructor.

  imgTask.execute(img);
}

UTILISATION DE L'ADAPTATEUR:

ImageView imv = (ImageView) rowView.findViewById(R.id.imageView);
ImagesCache cache = ImagesCache.getInstance();
cache.initializeCache();

String img = "your_image_url_here";

Bitmap bm = cache.getImageFromWarehouse(img);

if(bm != null)
{
  imv.setImageBitmap(bm);
}
else
{
  imv.setImageBitmap(null);

  DownloadImageTask imgTask = new DownloadImageTask(this, 300, 300);//Since you are using it from `Adapter` call first Constructor.

  imgTask.execute(img);
}

Remarque:

cache.initializeCache()vous pouvez utiliser cette instruction dans la toute première activité de votre application. Une fois que vous avez initialisé le cache, vous n'aurez jamais besoin de l'initialiser à chaque fois si vous utilisez ImagesCacheinstance.

Je ne suis jamais doué pour expliquer les choses mais j'espère que cela aidera les débutants à savoir comment mettre en cache l'utilisation LruCacheet son utilisation :)

ÉDITER:

Aujourd'hui, il existe des bibliothèques très célèbres connues sous le nom de Picassoet Glidequi peuvent être utilisées pour charger des images très efficacement dans l'application Android. Essayez cette bibliothèque très simple et utile Picasso pour Android et Glide pour Android . Vous n'avez pas à vous soucier des images de cache.

Picasso permet un chargement d'image sans tracas dans votre application, souvent en une seule ligne de code!

Glide, tout comme Picasso, peut charger et afficher des images provenant de nombreuses sources, tout en prenant en charge la mise en cache et en conservant un faible impact sur la mémoire lors des manipulations d'images. Il a été utilisé par les applications officielles de Google (comme l'application pour Google I / O 2015) et est tout aussi populaire que Picasso. Dans cette série, nous allons explorer les différences et les avantages de Glide sur Picasso.

Vous pouvez également visiter le blog pour la différence entre Glide et Picasso

Zubair Ahmed
la source
3
Réponse et explication exceptionnelles! Je pense que c'est la meilleure solution car elle fonctionne hors ligne et utilise Android LruCache. J'ai trouvé que la solution d'edrowland ne fonctionnait pas en mode avion même avec l'ajout de Joe qui nécessitait plus d'efforts pour s'intégrer. Btw, il semble qu'Android ou le réseau fournissent une quantité importante de mise en cache même si vous ne faites rien de plus. (Un petit détail: pour l'exemple d'utilisation de getImageFromWareHouse, le «H» doit être en minuscule pour correspondre.) Merci!
Edwin Evans
1
bonne explication :)
XtreemDeveloper
Pourriez-vous expliquer la méthode getImage (), en particulier ce qu'elle fait à la taille de l'image et comment cela se passe. Je ne comprends pas par exemple pourquoi vous appelez à nouveau la fonction à l'intérieur d'elle-même et comment cela fonctionne.
Greyshack
1
Votez pour ce if(cache == null)qui a résolu mon problème! :)
MR. Garcia
1
Voir également ma réponse modifiée à la fin. J'ai mentionné les bibliothèques célèbres utilisées par la plupart des développeurs depuis quelques jours. Essayez ces Picasso: square.github.io/picasso et Glide: futurestud.io/blog/glide-getting-started
Zubair Ahmed
18

Pour télécharger une image et l'enregistrer sur la carte mémoire, vous pouvez le faire comme ceci.

//First create a new URL object 
URL url = new URL("http://www.google.co.uk/logos/holiday09_2.gif")

//Next create a file, the example below will save to the SDCARD using JPEG format
File file = new File("/sdcard/example.jpg");

//Next create a Bitmap object and download the image to bitmap
Bitmap bitmap = BitmapFactory.decodeStream(url.openStream());

//Finally compress the bitmap, saving to the file previously created
bitmap.compress(CompressFormat.JPEG, 100, new FileOutputStream(file));

N'oubliez pas d'ajouter l'autorisation Internet à votre manifeste:

<uses-permission android:name="android.permission.INTERNET" />
Ljdawson
la source
10
Pourquoi décodez-vous le JPEG puis le recodez-vous? Vous feriez mieux de télécharger l'URL dans un tableau d'octets, puis d'utiliser ce tableau d'octets pour créer votre Bitmap et l'écrire dans un fichier. Chaque fois que vous décodez et réencodez un JPEG, la qualité de l'image se détériore.
CommonsWare
2
Bon point, c'était plus pour la vitesse que pour n'importe quoi. Bien que, s'il était enregistré sous forme de tableau d'octets et que le fichier source n'était pas un JPEG, le fichier n'aurait-il pas besoin d'être converti de toute façon? "decodeByteArray" du SDK Renvoie "Le bitmap décodé, ou nul si les données d'image ne peuvent pas être décodées" donc cela me fait penser qu'il décode toujours les données d'image donc cela n'aurait-il pas besoin de recodage à nouveau?
Ljdawson
En parlant d'efficacité, ne serait-il pas efficace si, au lieu de passer FileOutputStream, nous passions BufferedOutputStream?
Samuh
1
Je ne suggère pas de mettre en cache les images sur votre carte SD. une fois l'application désinstallée, les images ne sont pas supprimées, ce qui entraîne le remplissage de la carte SD avec des déchets inutiles. l'enregistrement des images dans le répertoire de cache de l'application est préférable IMO
james
Avec une limite APK de 50 Mo maintenant, la mise en cache sur la carte SD peut être le seul moyen pour les développeurs.
Ljdawson
13

J'envisagerais d'utiliser le cache d'image de droidfu. Il implémente à la fois un cache d'image en mémoire et sur disque. Vous obtenez également un WebImageView qui tire parti de la bibliothèque ImageCache.

Voici la description complète de droidfu et WebImageView: http://brainflush.wordpress.com/2009/11/23/droid-fu-part-2-webimageview-and-webgalleryadapter/

argent
la source
Il a remanié son code depuis 2010; voici le lien racine: github.com/kaeppler/droid-fu
esilver
3
Ce lien ne fonctionne toujours pas. J'ai écrit une bibliothèque similaire appelée Android-ImageManager github.com/felipecsl/Android-ImageManager
Felipe Lima
9

J'ai essayé SoftReferences, ils sont récupérés de manière trop agressive dans Android que je sentais qu'il ne servait à rien de les utiliser

2cupsOfTech
la source
2
D'accord - Les SoftReferences sont récupérés très rapidement sur les appareils que j'ai testés
esilver
3
Google a lui-même confirmé que le GC de Dalvik est très agressif dans la collecte de l' SoftReferenceart. Ils recommandent d'utiliser leur à la LruCacheplace.
kaka le
9

Comme l'a suggéré Thunder Rabbit, ImageDownloader est le meilleur pour le travail. J'ai également 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 ImageDownloader utilise le système de mise en cache Android et que celui modifié utilise le stockage interne et externe comme mise en cache, conservant les images en cache indéfiniment ou jusqu'à ce que l'utilisateur le supprime manuellement. L'auteur mentionne également la compatibilité Android 2.1.

EZFrag
la source
7

C'est une bonne prise de Joe. L'exemple de code ci-dessus a deux problèmes - un - l'objet de réponse n'est pas une instance de Bitmap (lorsque mon URL fait référence à un jpg, comme http: \ website.com \ image.jpg, c'est un

org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl $ LimitedInputStream).

Deuxièmement, comme le souligne Joe, aucune mise en cache n'a lieu sans la configuration d'un cache de réponse. Les développeurs Android doivent rouler leur propre cache. Voici un exemple pour le faire, mais cela ne met en cache que 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/

L'API de mise en cache URLConnection est décrite ici:

http://download.oracle.com/javase/6/docs/technotes/guides/net/http-cache.html

Je pense toujours que c'est une bonne solution pour suivre cette voie - mais vous devez toujours écrire un cache. Cela semble amusant, mais je préfère écrire des fonctionnalités.

Peter Pascale
la source
7

Il y a une entrée spéciale dans la section de formation officielle d'Android à ce sujet: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

La section est assez récente, elle n'était pas là lorsque la question a été posée.

La solution suggérée est d'utiliser un LruCache. Cette classe a été introduite sur Honeycomb, mais elle est également incluse dans la bibliothèque de compatibilité.

Vous pouvez initialiser un LruCache en définissant le nombre maximum d'entrées et il les triera automatiquement à votre guise et les nettoiera les moins utilisées lorsque vous dépassez la limite. Autre que cela, il est utilisé comme une carte normale.

L'exemple de code de la page officielle:

private LruCache mMemoryCache;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    // Get memory class of this device, exceeding this amount will throw an
    // OutOfMemory exception.
    final int memClass = ((ActivityManager) context.getSystemService(
            Context.ACTIVITY_SERVICE)).getMemoryClass();

    // Use 1/8th of the available memory for this memory cache.
    final int cacheSize = 1024 * 1024 * memClass / 8;

    mMemoryCache = new LruCache(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // The cache size will be measured in bytes rather than number of items.
            return bitmap.getByteCount();
        }
    };
    ...
}

public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        mMemoryCache.put(key, bitmap);
    }
}

public Bitmap getBitmapFromMemCache(String key) {
    return mMemoryCache.get(key);
}

Auparavant, SoftReferences était une bonne alternative, mais plus maintenant, citant la page officielle:

Remarque: Dans le passé, une implémentation de cache mémoire populaire était un cache bitmap SoftReference ou WeakReference, mais cela n'est pas recommandé. À partir d'Android 2.3 (niveau d'API 9), le garbage collector est plus agressif avec la collecte de références souples / faibles, ce qui les rend assez inefficaces. De plus, avant Android 3.0 (niveau d'API 11), les données de sauvegarde d'un bitmap étaient stockées dans la mémoire native qui n'est pas libérée de manière prévisible, ce qui pourrait entraîner un dépassement bref de ses limites de mémoire et un crash d'une application.

shalafi
la source
3

Envisagez d'utiliser la bibliothèque Universal Image Loader de Sergey Tarasevich . Il est livré avec:

  • Chargement d'image multithread. Il vous permet de définir la taille du pool de threads
  • Mise en cache d'image en mémoire, sur le système de fichiers de l'appareil et sur la carte SD.
  • Possibilité d'écouter la progression du chargement et les événements de chargement

Universal Image Loader permet une gestion détaillée du cache pour les images téléchargées, avec les configurations de cache suivantes:

  • UsingFreqLimitedMemoryCache: Le bitmap le moins fréquemment utilisé est supprimé lorsque la limite de taille du cache est dépassée.
  • LRULimitedMemoryCache: Le bitmap le moins récemment utilisé est supprimé lorsque la limite de taille du cache est dépassée.
  • FIFOLimitedMemoryCache: La règle FIFO est utilisée pour la suppression lorsque la limite de taille du cache est dépassée.
  • LargestLimitedMemoryCache: Le bitmap le plus grand est supprimé lorsque la limite de taille du cache est dépassée.
  • LimitedAgeMemoryCache: L'objet mis en cache est supprimé lorsque son âge dépasse la valeur définie .
  • WeakMemoryCache: Un cache mémoire avec uniquement des références faibles aux bitmaps.

Un exemple d'utilisation simple:

ImageView imageView = groupView.findViewById(R.id.imageView);
String imageUrl = "http://site.com/image.png"; 

ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.init(ImageLoaderConfiguration.createDefault(context));
imageLoader.displayImage(imageUrl, imageView);

Cet exemple utilise la valeur par défaut UsingFreqLimitedMemoryCache.

Gunnar Karlsson
la source
Lorsqu'il est utilisé de manière intensive, Universal Image Loader provoquera de nombreuses fuites de mémoire. Je soupçonne que cela se produit car il utilise des singletons dans le code (voir 'getInstance ()' dans l'exemple). Après avoir chargé de nombreuses images, puis avoir fait pivoter mon écran plusieurs fois, mon application s'est plantée tout le temps parce que OutOfMemoryErrors dans UIL. C'est une excellente bibliothèque mais c'est un fait bien connu que vous ne devriez JAMAIS utiliser de singletons, surtout pas sous Android ...
Geert Bellemans
1
UTILISEZ des singletons quand vous savez comment faire! :)
Renetik
3

Ce qui a réellement fonctionné pour moi a été de définir ResponseCache sur ma classe Main:

try {
   File httpCacheDir = new File(getApplicationContext().getCacheDir(), "http");
   long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
   HttpResponseCache.install(httpCacheDir, httpCacheSize);
} catch (IOException e) { } 

et

connection.setUseCaches(true);

lors du téléchargement de bitmap.

http://practicaldroid.blogspot.com/2013/01/utilizing-http-response-cache.html

ZamPrano
la source
est-il possible d'utiliser lrucache en conjonction avec httpresponsecache
iOSAndroidWindowsMobileAppsDev
1

J'avais lutté avec ça depuis un certain temps; les réponses utilisant SoftReferences perdraient leurs données trop rapidement. Les réponses qui suggèrent d'instancier un RequestCache étaient trop compliquées et je n'ai jamais pu trouver d'exemple complet.

Mais ImageDownloader.java fonctionne à merveille pour moi. Il utilise un HashMap jusqu'à ce que la capacité soit atteinte ou jusqu'à ce que le délai de purge se produise, puis les choses sont déplacées vers une SoftReference, utilisant ainsi le meilleur des deux mondes.

Lapin tonnerre
la source
0

Réponse encore plus tardive, mais j'ai écrit un gestionnaire d'images Android qui gère la mise en cache de manière transparente (mémoire et disque). Le code est sur Github https://github.com/felipecsl/Android-ImageManager

Felipe Lima
la source
1
J'ai ajouté ceci à un ListView et cela ne semble pas très bien gérer cela. Existe-t-il une implémentation spéciale pour ListViews?
0

Réponse tardive, mais je me suis dit que je devrais ajouter un lien vers mon site car j'ai écrit un tutoriel sur la création d'un cache d'image pour Android: http://squarewolf.nl/2010/11/android-image-cache/ Mise à jour: le La page a été mise hors ligne car la source était obsolète. Je rejoins @elenasys dans ses conseils d'utilisation d' Ignition .

Alors à toutes les personnes qui tombent sur cette question et n'ont pas trouvé de solution: j'espère que vous apprécierez! = D

Thomas Vervest
la source
0

Réponse tardive mais je pense que cette bibliothèque aidera beaucoup avec la mise en cache des images: https://github.com/crypticminds/ColdStorage .

Annotez simplement l'ImageView avec @LoadCache (R.id.id_of_my_image_view, "URL_to_downlaod_image_from) et il se chargera de télécharger l'image et de la charger dans la vue d'image. Vous pouvez également spécifier une image d'espace réservé et charger l'animation.

Une documentation détaillée de l'annotation est présente ici: - https://github.com/crypticminds/ColdStorage/wiki/@LoadImage-annotation

Anurag Mandal
la source