562 votes

Comment charger une ImageView par URL dans Android ?

Comment utiliser une image référencée par une URL dans un fichier ImageView ?

1 votes

2 votes

0 votes

Public class ImageDownloader { private final Executor executor = Executors.newSingleThreadExecutor() ; public void download(String url, Consumer<Bitmap> onSuccess, Consumer<Exception> onError) { Handler handler = new Handler() ; executor. execute(() -> { try (InputStream in = new URL(url).openStream()) { Bitmap result = BitmapFactory.decodeStream(in) ; handler.post(() -> onSuccess.accept(result)) ; } catch (Exception e) { handler.post(() -> onError.accept(e)) ; } }) ; } ; } ; > handler.post(() -> onError.accept(e)) ; }. }) ; } }

732voto

Android Developer Points 2521

De Développeur Android :

// show The Image in a ImageView
new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
            .execute("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");

public void onClick(View v) {
    startActivity(new Intent(this, IndexActivity.class));
    finish();

}

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    ImageView bmImage;

    public DownloadImageTask(ImageView bmImage) {
        this.bmImage = bmImage;
    }

    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        Bitmap mIcon11 = null;
        try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            mIcon11 = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return mIcon11;
    }

    protected void onPostExecute(Bitmap result) {
        bmImage.setImageBitmap(result);
    }
}

Assurez-vous que vous avez les permissions suivantes dans votre fichier AndroidManifest.xml pour accéder à l'internet.

<uses-permission android:name="android.permission.INTERNET" />

42 votes

C'est génial. Et devrait être beaucoup plus haut sur la liste. L'asynchronisme permet de charger sans geler l'interface utilisateur !

3 votes

AsyncTasks utilise un exécuteur en série, ce qui signifie que chaque image se chargera une à la fois et ne fera pas de chargement de fil parallèle.

2 votes

Le lien vers la source ne fonctionne plus...

151voto

steve Points 5838

Vous devez d'abord télécharger l'image.

public static Bitmap loadBitmap(String url) {
    Bitmap bitmap = null;
    InputStream in = null;
    BufferedOutputStream out = null;

    try {
        in = new BufferedInputStream(new URL(url).openStream(), IO_BUFFER_SIZE);

        final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
        out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
        copy(in, out);
        out.flush();

        final byte[] data = dataStream.toByteArray();
        BitmapFactory.Options options = new BitmapFactory.Options();
        //options.inSampleSize = 1;

        bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,options);
    } catch (IOException e) {
        Log.e(TAG, "Could not load Bitmap from: " + url);
    } finally {
        closeStream(in);
        closeStream(out);
    }

    return bitmap;
}

Utilisez ensuite Imageview.setImageBitmap pour définir le bitmap dans l'ImageView.

127 votes

Vous avez raison, mais ces 3 lignes suffisent à résoudre le problème. URL newurl = new URL(photo_url_str) ; mIcon_val = BitmapFactory.decodeStream(newurl.openConnection() .getInputStream()) ; profile_photo.setImageBitmap(mIcon_val) ; merci pour votre réponse.

2 votes

Pour l'URL - import java.net.URL ; private static final int IO_BUFFER_SIZE = 4 * 1024 ; quel était le dernier ?

12 votes

73voto

Praveen Points 29841

De toute façon les gens demandent mon commentaire pour le poster comme réponse. Je le poste.

URL newurl = new URL(photo_url_str); 
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);

0 votes

C'est court et génial, merci

21 votes

Mm cela ne peut pas être fait depuis le fil de l'interface utilisateur.

2 votes

Pour les personnes qui rencontrent des problèmes avec "Malformed URL Exeption", entourez les lignes ci-dessus dans un try/catch. stackoverflow.com/a/24418607/2093088

71voto

koush Points 1406

J'ai écrit une classe pour gérer cela, car cela semble être un besoin récurrent dans mes différents projets :

https://github.com/koush/UrlImageViewHelper

UrlImageViewHelper remplira un ImageView avec une image qui est trouvée à une URL.

L'exemple fera une recherche Google Image et charger/afficher les résultats de manière asynchrone.

UrlImageViewHelper va automatiquement télécharger, sauvegarder et mettre en cache toutes les urls d'image des BitmapDrawables. Les urls dupliquées ne seront pas chargées deux fois en mémoire deux fois. La mémoire des Bitmap est gérée en utilisant une table de hachage à référence faible, Ainsi, dès que l'image n'est plus utilisée par vous, elle sera automatiquement automatiquement.

0 votes

Quelle est la licence pour ça, au fait ?

0 votes

@Shurane - Apache. Je le noterai plus tard.

1 votes

Il semble que nous devions utiliser celui-ci à la place github.com/koush/ion car UrlImageViewHelper a été déprécié comme indiqué sur la page du projet github à l'adresse suivante github.com/koush/UrlImageViewHelper .

65voto

Kyle Clegg Points 8441

La réponse acceptée ci-dessus est excellente si vous chargez l'image en fonction d'un clic sur un bouton, mais si vous le faites dans une nouvelle activité, l'interface utilisateur se fige pendant une ou deux secondes. En cherchant un peu, j'ai découvert qu'une simple asynchronie éliminait ce problème.

Pour utiliser une asynchrone, ajoutez cette classe à la fin de votre activité :

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    ImageView bmImage;

    public DownloadImageTask(ImageView bmImage) {
        this.bmImage = bmImage;
    }

    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        Bitmap mIcon11 = null;
        try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            mIcon11 = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return mIcon11;
    }

    protected void onPostExecute(Bitmap result) {
        bmImage.setImageBitmap(result);
    }    
}

Et appelez depuis votre méthode onCreate() en utilisant :

new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
        .execute(MY_URL_STRING);

Le résultat est une activité rapidement chargée et une image qui s'affiche une fraction de seconde plus tard, selon la vitesse du réseau de l'utilisateur.

0 votes

C'était rapide et compact. Il a bien répondu à mes besoins ! Je vous remercie !

0 votes

À partir de mon horodatage, cela a fonctionné pour moi !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X