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