studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android android-asynctask custom-adapter

android - programacion - Cargando imagen usando AsyncTask



manual de programacion android pdf (1)

Intento crear un adaptador de lista personalizado que tenga una imagen para cada elemento que necesite descargar de Internet. Cuando ingreso por primera vez a la Actividad, la aplicación se congela por un tiempo hasta que se descargan las imágenes y luego se carga la Lista de actividades.

Como puedo ver, las imágenes se están descargando antes de que se cargue la actividad. ¿Cómo puedo descargar las imágenes después de que la actividad se haya cargado? Creo que necesito usar Async Task. Pero dado que estoy cargando las imágenes en el adaptador de matriz personalizada, no estoy seguro de cómo hacerlo.

Este es el getView() mi Adaptador Personalizado:

public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi; vi = LayoutInflater.from(getContext()); v = vi.inflate(R.layout.list_item_default, null); } Item p = items.get(position); if (p != null) { TextView list_title = (TextView) v.findViewById(R.id.list_title); TextView list_description = (TextView) v .findViewById(R.id.list_description); TextView list_timestamp = (TextView) v .findViewById(R.id.list_timestamp); ImageView list_image = (ImageView) v.findViewById(R.id.list_image); if (list_title != null) { list_title.setText(p.getItemTitle()); } if (list_description != null) { list_description.setText(p.getItemDescription()); } if (list_timestamp != null) { list_timestamp.setText(p.getItemTimestamp()); } if (list_image != null) { Log.d("bMobile", "inside getView() image"); try { URL imageURL = new URL(p.getItemImage()); HttpURLConnection con = (HttpURLConnection) imageURL .openConnection(); InputStream inputStrem = con.getInputStream(); Bitmap image = BitmapFactory.decodeStream(inputStrem); if (null != image) list_image.setImageBitmap(image); else Log.d("bMobile", "Bitmap is Null"); } catch (Exception e) { } } } return v; }

AsyncTask:

public class DownloadImagesTask extends AsyncTask<ImageView, Void, Bitmap> { ImageView imageView = null; @Override protected Bitmap doInBackground(ImageView... imageViews) { this.imageView = imageViews[0]; return download_Image((String)imageView.getTag()); } @Override protected void onPostExecute(Bitmap result) { imageView.setImageBitmap(result); } } private Bitmap download_Image(String url) { Bitmap bmp =null; try{ URL ulrn = new URL(url); HttpURLConnection con = (HttpURLConnection)ulrn.openConnection(); InputStream is = con.getInputStream(); bmp = BitmapFactory.decodeStream(is); if (null != bmp) return bmp; }catch(Exception e){} return bmp; }


"la aplicación se congela": esto se debe a que está descargando las imágenes en el hilo del evento o en el hilo UI. Nunca deberías hacer eso. Todas las operaciones de bloqueo, operaciones de larga duración, operaciones de red, deben ejecutarse en un hilo separado. Sí, puede usar asynctask para cargar la imagen, lo que debería solucionar el problema.

Dos opciones que puede hacer para resolver el problema son

  1. Use WebImageView de la biblioteca droid fu en http://brainflush.wordpress.com/2009/11/23/droid-fu-part-2-webimageview-and-webgalleryadapter/ WebImageView también utiliza el almacenamiento en caché para que no tenga que volver a descargar las imágenes que ya has descargado La descarga de imágenes es costosa y consume datos. Utilicé WebImageView y pude cargar imágenes en la lista. Me llevó casi 20 minutos lograr que todo funcione, por lo que es fácil integrarlo.

  2. La segunda opción es usar una tarea asíncrona. Comprueba Android: cargando una imagen desde la Web con Asynctask . Hay mucha más información en sobre cómo hacer esto.

Cada vez que cuelgue tu UI, deberías tener la sensación de que estás haciendo algo en el hilo de la IU.