Charger une image à partir de l'url dans Android, que si les petites
Je suis en utilisant BitmapFactory.decodeStream
pour charger une image à partir d'une url dans Android. Je veux seulement télécharger des images ci-dessous d'une certaine taille, et je suis actuellement à l'aide getContentLength
pour vérifier cela.
Cependant, je me suis dit que getContentLength
n'est pas toujours la taille du fichier, et dans ces cas je voudrais arrêter le téléchargement dès que je sais que le fichier est trop gros. Quelle est la bonne façon de le faire?
Voici mon code actuel. Je suis actuellement retourner la valeur null si getContentLength
ne donnent pas de réponse.
HttpGet httpRequest = new HttpGet(new URL(urlString).toURI());
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpClient.execute(httpRequest);
HttpEntity entity = response.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
final long contentLength = bufHttpEntity.getContentLength();
if ((contentLength >= 0 && (maxLength == 0 || contentLength < maxLength))) {
InputStream is = bufHttpEntity.getContent();
Bitmap bitmap = BitmapFactory.decodeStream(is);
return new BitmapDrawable(bitmap);
} else {
return null;
}
OriginalL'auteur hpique | 2010-07-25
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser HttpHead à émettre une requête HEAD, qui est semblable à OBTENIR, mais sera de retour que les en-têtes. Si la longueur du contenu est satisfaisant, alors vous pouvez faire votre demande pour obtenir le contenu.
La majorité des serveurs doit gérer les requêtes HEAD sans problème, mais de temps en temps un des serveurs d'application ne sera pas l'attendre et renvoie une erreur. Juste quelque chose d'être conscient de.
Mise à JOUR pensé que je voudrais essayer de répondre à votre question. Vous aurez probablement à lire les données dans un intermédiaire d'octets de la mémoire tampon avant de transmettre les données à la BitmapFactory.
Non, mais n'oubliez pas de toujours faire appel à consumeContent() sur l'entité, après utilisation, de sorte que HttpClient pouvez réutiliser la connexion.
Merci Nick. Je ne sais pas si à l'aide de HttpHead permettrait d'économiser de la bande passante, mais dans mon cas particulier, je préfère garder les requêtes http à un minimum.
OriginalL'auteur Nick
1 . Vous pouvez également essayer cette approche. Je crois qu'il ne sera pas télécharger du contenu pour les gros fichiers
C'est juste un échantillon, vous pouvez également ajouter vérifier -1 et rien d'autre.
Cette approche est équivalente à ce que vous faites. C'est juste une option de plus pour vous d'essayer. Je sais juste que HttpURLConnection ne pas récupérer le contenu jusqu'à ce que vous commencer à le lire à partir du flux. Si ce code ne sera pas télécharger des images de grande taille. Je ne sais vraiment pas si HttpClient fait la même chose ou pas.
2 . Pourquoi en fait, vous voulez passer de plus gros fichiers. Si vous êtes inquiet au sujet de dépassement de mémoire durung décodage peut prendre un coup d'oeil à ce Étrange, hors de question de la mémoire lors du chargement d'une image à un objet Bitmap. Si vous appliquez inSampleSize vous pouvez même télécharger des images de grande taille. Le délai sera plus grande pour les grandes images, mais la mémoire de la consommation sera faible. J'ai posté mon ListView échantillon ici Chargement différé des images dans la ListView. Il affiche les images dans la liste. Il existe différentes tailles d'images. Pas très grand, des images, mais de toute façon.
Mis à jour mon post avec plus de précisions.
Je suis plus préoccupé par la vitesse de défilement de dépassement de mémoire. Comme vous l'avez mentionné, le retard est plus important est que vous réduire la taille d'une grande image.
La taille de l'Image n'affecte pas la vitesse de défilement d'images étant télécharger/décodage doivent être traitées dans le thread d'arrière-plan. Jetez un oeil à mon LazyList échantillon - il fait exactement la même chose.
OriginalL'auteur Fedor
voici un bon exemple qui charge une image depuis le serveur.
blog.sptechnolab.com/2011/03/04/android/android-load-image-from-url/.
OriginalL'auteur user609239