Android – Enregistrement d'images téléchargées sur le Web

J'ai eu une question concernant si oui ou non (et comment) je devais stocker des images chargées depuis le Web. Disons que j'appelle un service Web depuis mon application Android. Dans ce service Web, je reçois une URL pour une image sur le Web. Je télécharge et montre cette image sur le côté gauche d'un élément de liste dans un ListView. Ma question est: quelle méthode dois-je utiliser pour stocker l'image? Devrais-je:

  1. Enregistrez-le sur la carte SD, vérifiez si elle existe lorsque le ListView est créé (sur les demandes ultérieures) et ré-téléchargez au besoin (lors de la mise à jour de l'image de temps en temps, au cas où cela changerait).
  2. Enregistrez-le dans le cache à l'aide de Context.getCacheDir (), mais peut-être forcé de le recharger plus souvent car je ne peux pas compter sur l'image restant dans le cache.
  3. Toujours le télécharger et ne jamais enregistrer l'image.

Les fichiers d'image eux-mêmes sont assez petits, mais je m'attends à ce que certains utilisateurs puissent avoir des dizaines de ces petites images téléchargées / stockées. Ce qui fonctionnerait le mieux, et / ou quelle est la méthode préférée?

  • La fenêtre de curseur n'a pas pu être créée à partir du classeur
  • Comment puis-je sérialiser un objet et l'enregistrer dans un fichier dans Android?
  • Eclipse: Spécifiez plusieurs répertoires res comme la spécification de plusieurs répertoires src
  • Calcul de la vitesse d'Internet dans Android
  • Précharger plus de vues à l'aide d'un adaptateur ListView
  • LocationManager.isProviderEnabled (LocationManager.NETWORK_PROVIDER) n'est pas fiable, pourquoi?
  • En tant que question secondaire, puis-je charger toutes les images dans mon ListView d'abord (et éventuellement verrouiller l'interface utilisateur pendant un certain temps) ou les charger de manière asynchrone, mais afficher un graphique d'espace réservé pendant ce temps (ce qui pourrait être un peu plus "laid")? Quelle est la norme ici?

  • Échec de résolution: com.google.firebase: base de données firebase: 10.2.0
  • Transparent LinearLayout sur Android
  • Comment générer une animation en boucle avec ViewPropertyAnimator?
  • ExpandableListView développe-t-il uniquement un bouton spécifique?
  • La couleur de remplissage de superposition de cercle n'est pas toujours dessinée sur Google Maps v2
  • Comment ajouter des bibliothèques Android avec des ressources sans utiliser Eclipse
  • 4 Solutions collect form web for “Android – Enregistrement d'images téléchargées sur le Web”

    À propos d'où stocker: La réponse dépend de ce qui est en cours de téléchargement et de la quantité. Ensuite, vous faites un choix.

    Par exemple: si vous téléchargez quelque chose qui est temporaire, moins de nombre (moins d'accès à distance) et la taille (moins de mémoire) et est local à une activité, vous devriez envisager de tenir les images en mémoire à l'aide de SoftReferences. SoftReferences peut entraîner des rejets, mais comme le nombre d'articles est petit, il devrait être abordable.

    Cependant, si le nombre d'éléments à télécharger dépasse un certain seuil (ce qui signifie plus d'extraction et de mémoire), vous devriez envisager de réduire les saisies et aussi la consommation de mémoire Runtime en les mettant en cache. Ici, vous pouvez choisir de les enregistrer sur la carte Sd ou sur la mémoire temporaire (répertoires de cache locaux vers l'application). Pour les éléments qui sont petits et ne tiennent compte que dans le contexte de l'application (p. Ex. Vignettes), l'utilisateur ne l'utilisera surtout pas en dehors de votre application. Ainsi, vous pouvez stocker de telles choses dans le répertoire du cache. La meilleure partie de leur utilisation est que vous n'avez pas à nettoyer le désordre. Il est traité automatiquement. Cela pourrait toutefois entraîner des retombées.

    Toutefois, si les éléments téléchargés sont de grande taille et peuvent être autonomes en dehors du contexte de l'application, telles que des images, des vidéos, des clips audio, SDcard devrait être votre option. Vous devriez également lire: Manipulation de gros Bitmaps pour éviter une erreur OOM pendant BitmapFactory.decodeStream (…)

    Notez que vous pouvez également vérifier si l'utilisation d'une base de données peut vous aider ici. Regarde ça

    Quelques considérations lors du chargement par défaut des éléments dans un ListView: vous devez effectuer le chargement en arrière-plan et ne pas bloquer le thread UI. Vous devriez envisager de montrer une image temporaire pendant que l'élément est en cours de téléchargement. Cela est évident dans de nombreuses applications natives. Pour un exemple de mise en œuvre de chargement par défaut, consultez ceci . En outre, pour les grandes listes, vous pouvez implémenter le modèle SlowAdapter (vérifier les démos de l'API). Il bloque essentiellement le téléchargement alors que la liste se déplace.

    Exemples de projets qui peuvent vous aider ici:

    Le projet Romain Guy's Shelves utilise deux niveaux de mise en cache dans lequel il emploie un cache en mémoire (HashMap contenant SoftReferences) et un stockage sur la carte Sd. Parcourez le code source ici

    Il existe également des bibliothèques open source que Mark Murphy a écrit (CWAC) et DroidFu qui peuvent vous aider ici.

    Bonne chance!

    En ce qui concerne votre «question secondaire» – je pense que le chargement de manière asynchrone serait le comportement préféré, d'autant plus que vous devez considérer cela avec des transactions réseau, il se peut que ce soit «verrouiller l'interface utilisateur pendant un certain temps», mais «verrouiller L'interface utilisateur en permanence "dans le cas où elle ne se charge jamais.

    Toutefois, si vous considérez ce comportement comme moche, vous pouvez définir une minuterie (1 ou 2 secondes) qui donne lieu à quelques-unes des images, et si elles ont toutes chargées ou que la minuterie a expiré, avancez et montrez l'interface utilisateur De toute façon avec des images placeholder et laissez le reste charger de manière asynchrone. Ce serait le moyen d'éviter les serrures permanentes de toute façon.

    En ce qui concerne la première partie de votre question, je pense que cela dépend beaucoup du contexte et du type d'images que vous affichez. Cependant, avec la plupart des sites Web, je pense que # 2 serait l'approche privilégiée, car vous ne voulez certainement pas télécharger plusieurs fois dans la même session, mais vous ne voulez probablement pas consommer un stockage permanent non plus.

    En ce qui concerne votre «question secondaire» – je pense que le chargement de manière asynchrone serait le comportement préféré, d'autant plus que vous devez considérer cela avec des transactions réseau, il se peut que ce soit «verrouiller l'interface utilisateur pendant un certain temps», mais «verrouiller L'interface utilisateur en permanence "dans le cas où elle ne se charge jamais.

    Pour éviter cela, si nous parlons de WebImageView par droid-fu, vous pouvez modifier la fonction ImageLoader.java initialise ()

    static int alive=-1; public static synchronized void initialize(Context context) { if (executor == null) { executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(DEFAULT_POOL_SIZE); } else if(alive==executor.getActiveCount()){ executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(DEFAULT_POOL_SIZE); } alive=executor.getActiveCount(); if (imageCache == null) { imageCache = new ImageCacheHope(context, 25, 5); } } 

    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

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.