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.
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.