Android: download di immagini e caricamento in ImageView con thread asincrono

Creato il 26 agosto 2010 da Andreafortuna @AndyF

Mi riaggancio al precedente post dove proponevo un frammento di codice che permetteva di creare un oggetto bitmap scaricando una immagine dal web, gestendo anche il caching.

Tuttavia, questa operazione porta via tempo e se la nostra applicazione ha necessità di caricare parecchie immagini in questo modo (penso ad esempio ad una ListView con un buon numero di elementi grafici) la reattività dell’interfaccia potrebbero risentirne pesantemente.

Come fare quindi? Semplicemente far eseguire la procedura di download, caching e caricamento su ImageView ad un thread separato, mentre l’interfaccia dell’applicazione continua a lavorare.

private class ImageLoader {

	    private  final WeakHashMap<ImageView, AsyncTask> assignments  = new WeakHashMap<ImageView, AsyncTask>();

	    public  void setImageAsync(final ImageView imageView, final String imageUrl) {
	        AsyncTask oldTask = assignments.get(imageView);
	        if (oldTask != null) {
	            oldTask.cancel(true);
	        }

	        // prepare to launch a new task to load this new image
	        AsyncTask<String, Integer, Bitmap> newTask = new AsyncTask<String, Integer, Bitmap>() {

	            protected void onPreExecute() {
	                // eventualmente creare una immagine di 'Loading...'
	            }

	            protected Bitmap doInBackground(String... urls) {
	                //il sorgente di downloadImage lo trovate nel post precedente
	                return Utils.downloadImage(imageUrl, null,getContext());
	            }

	            protected void onPostExecute(Bitmap bitmap) {
	                if (bitmap != null) {
	                    imageView.setImageBitmap(bitmap);
	                }
	            }
	        };
	        newTask.execute();
	        assignments.put(imageView, newTask);
	    }

	}

L’utilizzo è molto semplice:

new ImageLoader().setImageAsync(ImageView1, URL_IMMAGINE);

Filed under: Android, featured, Java, Programmazione