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);
            }
        }
}

Tipo/Autore: Pubblicato da: CorsoAndroid.it

© 2011-2024 CorsoAndroid.it - Tutti i diritti riservati. Corso Base Android per rompere il ghiaccio Creare app per android
NB: Tutti i marchi citati sono di proprietà dei rispettivi proprietari. Android is a trademark of Google Inc.