application est lente avec des images de android
Je suis en train de faire une application sur les images pour les afficher dans GridView, je suis aller chercher de 20 images à partir du serveur. La résolution de chaque image est de 720*540.J'ai utilisé JSON analyse pour récupérer l'url et utilisé le code ci-dessous pour convertir en Bitmap afin de mettre en images.
public static Bitmap loadImageFromUrl(String url) {
InputStream inputStream;Bitmap b;
try {
inputStream = (InputStream) new URL(url).getContent();
BitmapFactory.Options bpo= new BitmapFactory.Options();
if(bpo.outWidth>500) {
bpo.inSampleSize=8;
b=BitmapFactory.decodeStream(inputStream, null,bpo );
} else {
bpo.inSampleSize=2;
b=BitmapFactory.decodeStream(inputStream, null,bpo );
}
return b;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
mon appli fonctionne bien, mais il prend trop de temps pour charger les images. De sorte que mon appli est devenu lent. Dois-je diminuer la résolution des images?
comment sortir de ce problème?
OriginalL'auteur Abhi | 2011-08-09
Vous devez vous connecter pour publier un commentaire.
Si vous faites un affichage de la grille pour charger les 20 images de cette résolution, je vous suggère les suivantes:
Certainement à réduire la taille des images. À moins que vous visez une tablette, vous serez bien que la plupart des smartphones ne peut atteindre que la résolution avec 20 images.
Cache des images si vous le pouvez.
Télécharger les images sur un thread différent. Stocker une table de hachage serait le rendre facile pour vous, il suffit de mettre tous les imageviews avec les noms de fichier d'image ou de toute autre forme de codes d'identification de touches. envoyer un message à votre Gestionnaire lorsque les images sont téléchargées et mise à jour de la vue après il est décodé. Vous pouvez récupérer vos points de vue directement. N'oubliez pas de vérifier s'ils sont toujours dans la fenêtre. De cette façon, les images s'affichent l'une après l'autre rapidement. Je ne pense pas que le multithreading les images d'aide, assurez-vous d'utiliser un autre thread pour "pousser les images" et le main thread de l'INTERFACE utilisateur des mises à jour. L'expérience utilisateur sera grandement améliorée ensuite.
Espère que cette aide.
---certaines implémentations, je n'ai pas le code complet avec moi---
Ont une structure de données pour correspondre à la vue avec des données qui vient dans. très pratique ici.
Lorsque vous obtenez la liste des url de l'image, parcourir:
(Ici l'image de lecture sera tout simplement de récupérer l'image si elle n'est pas déjà mis en cache et le cache)
Code pour mettre à jour l'affichage de l'image:
Si vous êtes en montrant que de nombreuses images, vous pouvez pas afficher les vignettes sur l'affichage de la grille? Après la récupération de toutes ces, vous de commencer l'extraction de certains de l'original de la résolution dans le fond donc, si il clique dessus, il sera cherché.
oui, cette idée est bonne, est-il possible de convertir ses images en vignettes par programme
oui. selon le type d'image que vous travaillez avec il y a différentes optimisation de l'image et le redimensionnement du programme. PS sera suffisant pour le redimensionnement et la moyenne d'optimisation.
Titus, si vous étiez de programmation pour créer les vignettes, vous auriez encore à récupérer les images de grande taille à partir du serveur et il ne serait pas aider votre cause. Ce Edison signifie que vous créez des vignettes-vous avec l'éditeur d'image de votre choix, et de les stocker sur le serveur à côté de votre salut-res images. De cette façon, vous pouvez télécharger les vignettes beaucoup plus rapide, et la présenter à l'utilisateur pendant que vous allez chercher le salut-res images en arrière-plan.
OriginalL'auteur Edison
Je devine que la plupart du temps de chargement est à cause de la grande quantité d'images combinées avec la taille des images.
Il y a 2 solutions possibles:
Redimensionner les images, ou réduire la qualité des images, de sorte que la taille est en dessous de 75 ko.
Utiliser le multi-threading pour récupérer plusieurs images à la fois. Cela pourrait ne pas aider si la connexion de l'utilisateur est vraiment lent, mais si vous combinez cela avec une assez petite taille, il peut juste aider suffisamment. Vous pourriez déterminer la largeur de bande actuelle de l'appareil de base et le nombre de threads que vous exécutez sur.
Par exemple: 20 images de 75 KO chacune et d'une connexion disponible de 200 KO/s = 3 ou 4 threads simultanés.
Espère que cette aide.
j'ai utilisé asynchrone pour récupérer toutes les images
si vous avez des problèmes avec l'application de l'idée de Bram a donné à vous créer une autre question et de nous montrer le code que vous avez fait et où vos problèmes, nous pouvons seulement vous aider si vous avez un problème spécifique. Stackoverflow ne sera pas simplement vous donner tout le code dont vous avez besoin pour la copie et le collage.
Tir plusieurs événements de réseau sont mauvais dans un environnement mobile avec de gros fichiers. Protocole TCP chasser tous vos threads lorsque la congestion commence.
OriginalL'auteur Bram Vandenbussche
J'ai le même problème dans mon application android. Lorsque vous décoder une image bitmap à partir d'une grande taille d'image et la définir comme imageBitmap à une image vue probablement votre demande sera lente et après quelques essayages, vous pourrez obtenir un "out of memory" l'exception
Deux de la les moyens possibles, vous pouvez essayer de gérer ce problème:
1 - Réduire la taille du bitmap lorsque vous décoder à partir d'un fichier
2 - l'Utilisation d'une bibliothèque d'images.
J'ai préféré la deuxième façon et utilisés Image Universelle de Chargeur. https://github.com/nostra13/Android-Universal-Image-Loader
OriginalL'auteur savepopulation
lorsque vous appelez la méthode ,dans le contrôle gridView méthode getView:
Ici
getLink()
est le lien internet.OriginalL'auteur pengwang
Picasso bibliothèque
Solution est plutôt de l'utilisation de la bitmap de chargement de l'image utiliser directement une impressionnante Bibliothèque appelé Picasso son juste super rapide je sais que vous aimez vraiment ce que vous pouvez faire cela comme ça
Ajouter picasso fichier jar de votre projet (à Télécharger picasso fichier jar ici) Utilisation de picasso à la charge de l'Image comme ceci
où le titre est le chemin de l'image qui vous voulez charger. Recadrer,de redimensionner, d'erreur sont facultatifs.
OriginalL'auteur Shivaraj Patil