Conectividad para miles de millones de usuarios

Más de la mitad de los usuarios de todo el mundo utilizará tu app a través de una conexión 2G. A fin de mejorar su experiencia, optimízala para conexiones de baja velocidad y procesos sin conexión almacenando datos, colocando solicitudes en cola y controlando imágenes para tener un rendimiento óptimo.

Aquí encontrarás algunas sugerencias sobre cómo lograr estos objetivos.

Optimiza imágenes

Hay varias formas de facilitar la descarga de imágenes. Esto incluye entregar imágenes WebP, cambiar de manera dinámica el tamaño de las imágenes y usar bibliotecas de carga de imágenes.

Ofrece imágenes WebP

  • Entrega archivos WebP a través de la red a fin de reducir los tiempos de carga de imágenes y ahorrar ancho de banda. Un archivo WebP suele tener un tamaño más pequeño que sus contrapartes PNG y JPG, con al menos la misma calidad de la imagen. Incluso en configuraciones con pérdida, WebP puede producir una imagen casi idéntica a la original. Android incluye compatibilidad con WebP con pérdida desde Android 4.0 (nivel de API 14: Ice Cream Sandwich) y compatibilidad con WebP transparente y sin pérdida desde Android 4.2 (nivel de API 17: Jelly Bean).

Cambia el tamaño de tus imágenes dinámicamente

  • Haz que tus apps soliciten imágenes con el tamaño de renderización de destino, según la especificación del dispositivo, y que tu servidor proporcione imágenes del tamaño adecuado. De esta forma, se minimizan los datos enviados de la red y se disminuye la cantidad de memoria necesaria para almacenar cada imagen. En consecuencia, mejora el rendimiento y aumenta la satisfacción del usuario.
  • La experiencia del usuario se ve afectada cuando es necesario esperar a que las imágenes se descarguen. Si se usan los tamaños de imagen adecuados, será más fácil solucionar estos problemas. Considera realizar las solicitudes de tamaño de la imagen según el tipo o la calidad de la red. Este tamaño podría ser inferior al tamaño de renderización objetivo.
  • Los marcadores de posición dinámicos, como los valores de paleta ya calculados o las miniaturas en baja resolución, pueden mejorar la experiencia del usuario mientras se recupera la imagen.

Usa bibliotecas de carga de imágenes

  • La app no tendría que buscar una imagen más de una vez. Las bibliotecas de carga de imágenes, como Glide y Picasso, recuperan la imagen, la almacenan en caché y proporcionan hooks a tus vistas a fin de mostrar imágenes como marcadores de posición hasta que las imágenes reales estén listas. Debido a que las imágenes se encuentran almacenadas en caché, estas bibliotecas mostrarán las copias locales cuando se vuelvan a solicitar.
  • Las bibliotecas de carga de imágenes gestionan su caché y conservan las imágenes más recientes para que el almacenamiento de tu app no aumente indefinidamente.

Optimiza las redes

Puedes mejorar la experiencia del usuario proporcionando una experiencia de red óptima. Por ejemplo, puedes hacer que tu app se pueda utilizar sin conexión, usar WorkManager y Room, y anular las solicitudes de red duplicadas.

Permite que tu app funcione sin conexión

  • En zonas rurales y alejadas, es frecuente que los dispositivos pierdan la conectividad de red. Si creas estados útiles sin conexión, los usuarios podrán interactuar con tu app en todo momento. Para ello, almacena los datos de forma local, guarda los datos en caché y coloca las solicitudes salientes en cola de modo que se procesen cuando se restablezca la conectividad.
  • Siempre que sea posible, las apps no deberían notificar al usuario que se perdió la conectividad. Solo será necesario hacerlo cuando el usuario realice una operación que requiera conexión de forma imprescindible.
  • Cuando un dispositivo no tenga conexión, tu app deberá acumular las solicitudes de red en nombre del usuario de modo que se ejecuten cuando se restablezca la conectividad. Como ejemplo, podemos considerar un cliente de correo electrónico que permita a los usuarios redactar, enviar, leer, mover y borrar correos electrónicos existentes aun cuando el dispositivo no tenga conexión. Estas operaciones pueden almacenarse en caché y ejecutarse cuando se restablezca la conexión. De esta forma, la app podrá ofrecer una experiencia del usuario que será siempre similar, independientemente de que dispositivo esté en línea o sin conexión.

Usa Room para recuperar datos y almacenarlos en caché

  • Asegúrate de que tu app almacene todos los datos en disco a través de una base de datos o estructura similar de modo que el rendimiento sea óptimo, independientemente de las condiciones de la red. Usa la biblioteca de persistencias de Room para almacenar datos en caché en una base de datos local y usa WorkManager a fin de actualizar esa caché cuando el dispositivo tenga una conexión de red.
  • Las apps deben almacenar en caché el contenido que se busca en la red. Antes de realizar solicitudes posteriores, las apps deben mostrar los datos almacenados en caché de forma local. De esta forma, se garantiza que la app funcione aunque el dispositivo se encuentre sin conexión o esté conectado a una red lenta o no confiable.

Elimina duplicaciones de solicitudes de red

  • Si una arquitectura prioriza la condición sin conexión, primero intenta recuperar datos almacenados de forma local. Si esto falla, solicita los datos a la red. Cuando se obtienen los datos de la red, estos se almacenan en caché de forma local para su recuperación en el futuro. Esto ayuda a garantizar que las solicitudes de red que incluyan un mismo bloque de datos ocurran solo una vez (el resto de las solicitudes se cumplirán localmente). A fin de lograr esto, usa una base de datos local para los datos de larga duración (por lo general, android.database.sqlite o SharedPreferences).
  • En este tipo de arquitectura, también se simplifican los flujos de la app entre los estados sin conexión y en línea, ya que un extremo recupera los datos desde la red a la caché mientras que el otro los recupera desde la caché a efectos de mostrárselos al usuario.
  • Para los datos transitorios, usa una caché de disco limitado, como DiskLruCache. Los datos que por lo general no cambian solo deben solicitarse una vez en la red y almacenarse en caché para usarse posteriormente. Las imágenes y los documentos no temporales, como los artículos de noticias o las publicaciones en redes sociales, son ejemplos de estos datos.

Optimiza la transferencia de datos

Hay varias maneras en las que tu app puede adaptarse a las condiciones de red a fin de proporcionar una mejor experiencia del usuario. Por ejemplo, puede priorizar las solicitudes de red para minimizar el tiempo de espera de información del usuario. También puede detectar velocidades de red más lentas y los cambios que puedan producirse en la conexión de red, y adaptarse a ellos.

Prioriza el ancho de banda

  • No des por sentado que todas las redes a las que se conecte el dispositivo serán de larga duración o confiables. Por esta razón, las apps deben priorizar las solicitudes de red de modo que se muestre al usuario la información más útil lo antes posible.
  • Presentar al usuario información visible y relevante de forma inmediata supone una mejor experiencia del usuario cuando se compara con hacerlo esperar por información que tal vez no sea necesaria. Así se disminuye el tiempo de espera del usuario y aumenta la utilidad de la app en redes lentas.
  • Para lograr esto, establece una secuencia de solicitudes de red a fin de que se recupere texto antes que rich media. Por lo general, las solicitudes de texto son más pequeñas y tienen una mejor compresión, por lo cual se transfieren más rápido. Esto significa que tu app podrá mostrar contenido útil rápidamente. Si deseas obtener más información sobre la administración de solicitudes de red, visita la capacitación de Android sobre la administración del uso de redes.

Usa menos ancho de banda en conexiones más lentas

  • La capacidad de tu app para transferir datos de manera oportuna depende de la conexión de red. Detectar la calidad de la red y ajustar la forma en que la app la usa puede ayudar a brindar una excelente experiencia del usuario.
  • Puedes usar los siguientes métodos a fin de detectar la calidad de la red subyacente. Con los datos de estos métodos, tu app podrá personalizar el uso de la red y seguir proporcionando una respuesta oportuna a las acciones del usuario:
  • En conexiones más lentas, considera descargar únicamente el contenido multimedia de menor resolución o, tal vez, no descargar nada. De esta forma, te asegurarás de que los usuarios puedan seguir utilizando la app en conexiones lentas. En los casos en que no tengas una imagen o esta tarde en cargarse, deberías colocar un marcador de posición. Puedes crear uno dinámico si usas la biblioteca de Palette a fin de generar colores de marcadores de posición que coincidan con la imagen objetivo.
  • En dispositivos con Android 7.0 (nivel de API 24) y versiones posteriores, los usuarios pueden activar la configuración del Ahorro de datos, que ayuda a minimizar el uso de datos. Android 7.0 amplía ConnectivityManager a efectos de detectar la configuración del Ahorro de datos. Si deseas obtener más información sobre esta función, consulta Ahorro de datos.

Detecta los cambios en la red y modifica el comportamiento de la app

  • La calidad de las redes no es estática: varía según la ubicación, el tráfico de red y la densidad de la población local. Las apps deben detectar los cambios en la red y ajustar el ancho de banda en consecuencia. De esta forma, la app puede personalizar la experiencia del usuario en función de la calidad de la red. Detecta el estado de la red con los siguientes métodos:
  • A medida que se degrade la calidad de la red, reduce la escala verticalmente de la cantidad y el tamaño de las solicitudes. A medida que mejore la calidad de la conexión, podrás escalar verticalmente las solicitudes a fin de alcanzar niveles óptimos.
  • En redes de mayor calidad y no medidas, te recomendamos que realices una carga previa de los datos de modo que estén disponibles con anticipación. Desde el punto de vista de la experiencia del usuario, esto puede implicar que las apps de noticias recuperen tres artículos a la vez con conexión a 2G, pero recuperen veinte con conexión a Wi-Fi. Si deseas obtener más información para configurar el comportamiento de la app de acuerdo con los cambios en la red, consulta la capacitación de Android sobre la supervisión del estado de la conectividad.
  • Se envía la transmisión CONNECTIVITY_CHANGE cuando se produce un cambio en la conectividad de la red. Cuando tu app esté en primer plano, podrás llamar a registerReceiver de modo que reciba esta transmisión. Tras recibirla, debes volver a evaluar el estado de la red actual y ajustar tu IU y el uso de la red en consecuencia. No debes declarar este receptor en tu manifiesto, ya que esta función no está disponible en Android 7.0 (nivel de API 24) y versiones posteriores. Si deseas obtener más información sobre este y otros cambios en Android 7.0, consulta Cambios en Android 7.0.

Recursos adicionales

Si deseas obtener más información para admitir una variedad de velocidades de conexión, consulta el siguiente recurso:

Blog post