Cuando desarrollamos una app podemos encontrarnos con la necesidad de tener que cargar  imágenes, que están alojadas en un servidor externo.Por lo que en este post hablaremos de como Cargar imagen desde URL en Android.

Algunas imágenes las podemos incluir en la misma aplicación,sin embargo por ejemplo los avatares de usuarios regularmente las cargamos de un servidor.

Todos los componentes de una app se ejecutan en el mismo hilo de ejecución, lo que llamamos hilo principal, es también el hilo donde se ejecutan las operaciones de gestión de interfaz. Por esto cualquier operación larga o costosa en este hilo va a bloquear la ejecución del resto de componentes  lo cual produce un efecto de lentitud o bloqueo de la app e incluso si detecta que supera los 5 segundos, se muestra el famoso mensaje de “Application Not Responding” (ANR) y el usuario debe decidir entre forzar el cierre de la aplicación o esperar a que termine.

Es por esto que para poder cargar una imagen desde un servidor externo vamos a utilizar una tarea en segundo plano, es decir, un segundo hilo de ejecución para lo que vamos a utilizar la librería AsyncTask.

Uso de AsyncTask

De forma básica debemos crear una nueva clase extendida de  AsyncTask y sobrescribir los métodos entre los que repartimos la funcionalidad de la tarea.

  • onPreExecute(). Se ejecuta antes del código principal de nuestra tarea.
  • doInBackground(). Código principal de nuestra tarea.
  • onProgressUpdate(). Se ejecuta cada vez que llamemos al método publishProgress() desde el método doInBackground().
  • onPostExecute(). Se ejecuta cuando finalice nuestra tarea.
  • onCancelled(). Se ejecutará cuando se cancele la ejecución de la tarea antes de su finalización normal.

Mas información.

Es solo doInBackground() el que se ejecuta en segundo plano los demás métodos se pueden ejecutar en el hilo principal.

public class LoadImage  extends AsyncTask<String, Void, Bitmap> {
    public LoadImage(Listener listener) {
        mListener = listener;
    }

    public interface Listener{
        void onImageLoaded(Bitmap bitmap);
        void onError();
    }
    private Listener mListener;
    @Override
    protected Bitmap doInBackground(String... args) {
        try {
            return BitmapFactory.decodeStream((InputStream)new URL(args[0]).getContent());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (bitmap != null) {
            mListener.onImageLoaded(bitmap);
        } else {
            mListener.onError();
        }
    }

}

Vamos a usar la opcion Bitmap para crear un mapa de bits para poder mostrar la imagen. COn la opción BitmapFactoru  obtenemos los bytes de la imagen a la cual hace referencia la URL.

BitmapFactory.decodeStream((InputStream)new URL(args[0]).getContent());

En la Actividad en la que vayamos a usar la clase debemos importarla para acceder a ella.

import com.ochentabits.guigo.Class.LoadImage;

 

Así también indicamos que se implementara

public class Profile extends Fragment implements LoadImage.Listener {

Vamos a crear una variable String para indicar la url.

private String imageHttpAddress = “https://…….”;

Creamos un objeto nuevo y ejecutamos el hilo en segundo plano.

new LoadImage(this).execute(imageHttpAddress);

De esta manera sencilla podemos cargar una imagen desde la URL. Espero que este pequeño tutorial pueda ser de ayuda. Si tienen alguna duda u opinión pueden dejarlo en los comentarios.

por Esther Lopez

Programadora, Experiencia en educación para niños en el ámbito de la robótica, conferencista y activista en grupos donde enseñen programación a mujeres y niños de forma fácil.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.