Acceder a un recurso de Internet desde Android

En alguna ocasión nos han preguntado cómo obtener desde Android algún recurso que esté disponible en Internet, alguna imagen, xml o fichero html que queramos tratar programáticamente por ejemplo. La solución no tiene gran misterio y aunque sí es verdad que no es algo exclusivo de Android, es algo habitual en nuestras APPs y nos parece importante recordar algunas buenas practicas a tener en cuenta.

Añade los permisos necesarios

Recuerda añadir los permisos necesarios para que tus aplicaciones tengan acceso a Internet, si no lo haces te darás cuenta antes de liberar una versión en el Store, pero no está de más recordarlo y podrá librarte de algún que otro quebradero de cabeza.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Adelántate a errores

Adelántate a posibles errores y piensa en medidas de compensación para evitarlos o paliarlos. Si lo que estás accediendo por ejemplo es a imágenes que se muestran en la UI de la aplicación, quizás te interese tener algún drawable por defecto que sustituya a esa imagen imposible de cargar.

Comprueba si tienes conexión a Internet, no olvides que estamos hablando de aplicaciones en dispositivos móviles, no siempre dispondrás de la cobertura necesaria. En este artículo explicamos cómo hacerlo. Piensa si hay alguna manera de dar servicio sin conexión (aunque en ciertas ocasiones no sea posible).

Trabaja en paralelo

La descarga de ese recurso puede llevar su tiempo, es buena idea que lo ejecutes en una tarea asíncrona de Android (TaskAsync). Ya hay mucho escrito sobre los motivos de utilizar este método y ejemplos más detallados, sólo debes implementar 3 métodos con las instrucciones a realizar antes (onPreExecute) , después (onPostExecute) y durante la tarea (doInBackground).

private class TuTareaAsincrona extends AsyncTask<String, Void, String> {
     @Override
    protected void onPreExecute() {
        //acciones antes
         [...]
    }

    @Override
    protected String doInBackground(String... urls) {
            PaginaDTO paginaDTO = PaginaService.getInstance().getInformacion(urls);
            return "";
    }

    @Override
    protected void onPostExecute(String result) {
        //Acciones después
         [...]
 
    }
}

Optimiza el rendimiento

Piensa cuándo es necesario acceder al recurso, ¿al entrar en la aplicación o cada un tiempo preestablecido? ¿Cada cuánto tiempo cambia esa información, es imprescindible tenerla actualizada en tiempo real?  Por ejemplo, el precio de la energía se publica una vez al día y en un rango de horas determinada, será por tanto más eficiente minimizar las veces que se accede a esa información, ahorramos en tráfico y optimizamos el rendimiento.

Conclusión

Estando frente a una revolución tecnológica que nos empuja cada vez más a la evolución de una arquitectura SOA con tintes de Cloud Computing, será fácil que nuestras aplicaciones accedan a recursos de negocio expuestos en Internet. Hay seguro otras maneras de hacerlo, os dejamos una de ellas, pero seguro que tú te has encontrado con otras y también tendrás tus propias buenas prácticas. ¿Quieres compartirlas?

HttpURLConnection urlConnection = null;
try{

    URL url = new URL("https://blog.conceptberria.es/feed/");
    urlConnection = (HttpURLConnection) url.openConnection();

    InputStream retorno = urlConnection.getInputStream();
    int responseCode= urlConnection.getResponseCode();

    if (responseCode!=HttpURLConnection.HTTP_OK){
        throw new PaginaConnectFailException("Error de conexión");
    }

    return XMLParserUtil.getInstance().parse(retorno);
} catch (MalformedURLException e) {
    throw new PaginaConnectFailException(e);
} catch (IOException e) {
    throw new PaginaConnectFailException(e);
} finally{
    if(urlConnection!=null){
      urlConnection.disconnect();
    }
}