AsyncTask per il download di un'immagine in Android
Come scaricare da remoto e visualizzare un'immagine all'interno di una Activity Android.
Le immagini rappresentano uno degli elementi chiave di molte Activity. Se pensiamo ad esempio ad un file XML remoto, che presenta all'interno una serie di informazioni, noi sappiamo già come si effettua il parsing e la relativa visualizzazione dei dati all'interno dei layout. Lo abbiamo visto in dettaglio nel WEBCAMP Android sulla progettazione di un'app per la lettura di news. Nel caso di dati stringa, non ci sono particolari problematiche, in quanto basterà inserirle all'interno di un TextView, mentre nel caso di immagini, è necessario scaricare e decodificare l'immagine bitmap, per poterla poi "iniettare" all'interno di un ImageView.
Il processo di download e di iniezione dell'immagine, non potrà essere eseguito nel'Activity principale, ma dovremo usare un AsyncTask, o una delle tante librerie online per il caricamento di immagini da remoto come Picasso o Glide.
Qui sotto un possibile esempio. Ricorda che per accedere alla rete per il download, devi avere settato i permessi corretti nel file manifest (android.permission.INTERNET)
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="creareapp.com.asynctask.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/testo" android:text="Esempio di immagine caricata da URL remoto!" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="11dp" android:layout_marginTop="43dp" android:id="@+id/immagineRemota" /> </RelativeLayout>
Il layout qui sopra non ha bisogno di spiegazioni. Dovremo solo ricordarci l'id associato a ImageView (immagineRemota).
public class MainActivity extends Activity { private ImageView ivBasicImage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ivBasicImage = (ImageView) findViewById(R.id.immagineRemota); // definisco manualmente la stringa url, da dove recuperare l'immagine String url = "http://www.corsoandroid.it/images/testasyncimage.jpg"; // Scarico l'immagine da mostrare new imageDownload(ivBasicImage).execute(url); } // Definisco l'AsyncTask che scaricherà l'immagine e la visualizzera nell' ImageView private class imageDownload extends AsyncTask<String, Void, Bitmap> { ImageView imageView; public imageDownload(ImageView imageView) { this.imageView = imageView; } protected Bitmap doInBackground(String... addresses) { Bitmap bitmap = null; InputStream in = null; try { // 1. Recupero e definisco l'url da richiamare URL url = new URL(addresses[0]); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 2. Apro la connessione conn.connect(); in = conn.getInputStream(); // 3. Download e decodifico l'immagine bitmap bitmap = BitmapFactory.decodeStream(in); } catch (IOException e) { e.printStackTrace(); } return bitmap; } @Override protected void onPostExecute(Bitmap result) { imageView.setImageBitmap(result); } } }
2024-10-06 Tipo/Autore: Davide Copelli {ing} Pubblicato da: CorsoAndroid.it