Comment utiliser une image référencée par une URL dans un fichier ImageView
?
C'est génial. Et devrait être beaucoup plus haut sur la liste. L'asynchronisme permet de charger sans geler l'interface utilisateur !
Comment utiliser une image référencée par une URL dans un fichier ImageView
?
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" />
C'est génial. Et devrait être beaucoup plus haut sur la liste. L'asynchronisme permet de charger sans geler l'interface utilisateur !
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.
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.
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.
Pour l'URL - import java.net.URL ; private static final int IO_BUFFER_SIZE = 4 * 1024 ; quel était le dernier ?
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
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.
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 .
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.
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.
1 votes
Essayez celui-ci stackoverflow.com/questions/14332296/
2 votes
Utilisez Picasso... stackoverflow.com/a/23865531/3535286
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)) ; }. }) ; } }