Conectividad para miles de millones de usuarios

Más de la mitad de los usuarios de todo el mundo podrá disfrutar de tu app a través de una conexión 2G. A fin de mejorar su experiencia, optimiza tu contenido para conexiones de baja velocidad y procesos sin conexión almacenando datos, ordenando solicitudes en cola y administrando 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 publicar imágenes WebP, cambiar dinámicamente el tamaño de los archivos y usar bibliotecas de carga de imágenes.

Ofrece imágenes WebP

  • Publica archivos WebP a través de la red para reducir los tiempos de carga de imágenes y ahorrar ancho de banda. Un archivo WebP suele ser más pequeño en tamaño que sus equivalentes PNG y JPG, con al menos la misma calidad de imagen. Incluso en configuraciones de compresión con pérdida, WebP puede producir una imagen casi idéntica a la original. Android ha ofrecido compatibilidad con WebP para compresión con pérdida desde la versión 4.0 (nivel de API 14: Ice Cream Sandwich) y compatibilidad con compresión sin pérdida/transparente de WebP desde la versión 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 procesamiento de destino, basado en la especificación del dispositivo, y que tu servidor proporcione imágenes del tamaño adecuado. De esta forma, se minimiza los datos enviados de la red, y disminuye la cantidad de memoria necesaria para almacenar cada imagen. En consecuencia, mejora el rendimiento y aumenta la satisfacción del usuario.
  • La experiencia se ve afectada cuando los usuarios tienen que 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. Una buena idea es realizar las solicitudes según el tipo o la calidad de la red; es posible que este tamaño sea inferior al de procesamiento de destino.
  • Los marcadores de posición dinámicos, como valores de paleta ya calculados o miniaturas en baja resolución, pueden mejorar la experiencia del usuario mientras se busca 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, buscan la imagen, la almacenan en caché y proporcionan vínculos a tus vistas para mostrar imágenes con 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é; 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, utilizar GcmNetworkManager y proveedores de contenido, y eliminar duplicaciones de las solicitudes de red.

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 experiencias ú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 para que se procesen cuando se restablezca la conectividad.
  • Si es posible, las apps no deben notificar al usuario que se perdió la conectividad. Solo será necesario notificarlo cuando se realice una operación que requiera conexión de forma imprescindible.
  • Cuando un dispositivo no tenga conexión, tu app deberá acumular solicitudes de red —para el usuario— a fin de que se ejecuten cuando se recupere la conexión. 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 recupere la conexión. De esta forma, la app podrá ofrecer una experiencia similar cuando el dispositivo tenga conexión o no.

Usa GcmNetworkManager o proveedores de contenido

  • Verifica que tu app almacene todos los datos en disco a través de una base de datos o estructura similar para que el rendimiento sea óptimo, independientemente de las condiciones de la red (por ejemplo, a través de SQLite + ContentProvider). El administrador de redes de GCM (GcmNetworkManager) ofrece un mecanismo robusto para sincronizar datos con servidores mientras los proveedores de contenido (ContentProvider) almacenan esos datos en caché. Juntos pueden proporcionar una arquitectura que habilite un estado sin conexión de utilidad.
  • 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 bien en una red lenta o no confiable.

Elimina duplicaciones de solicitudes de red

  • Una arquitectura que priorice la condición sin conexión primero intenta buscar datos almacenados de forma local. Si esto falla, solicita datos en la red. Cuando se obtienen los datos de la red, se almacenan en el caché de forma local para su recuperación posterior. Esto ayuda a garantizar que las solicitudes de red que incluyan un mismo bloque de datos solo existan una vez; el resto de las solicitudes se satisfarán a nivel local. Para ello, usa una base de datos local destinada a 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 con conexión, ya que en un extremo se realiza la búsqueda en la red y el almacenamiento en caché, mientras que en el otro se recuperan los datos de la caché para mostrárselos al usuario.
  • Para los datos transitorios, usa un caché de disco limitado, como DiskLruCache. Los datos que generalmente 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 para 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 y adaptarse a velocidades de red más lentas, y a los cambios que puedan producirse en la conexión de red.

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 para 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 para el usuario cuando se compara con hacerlo esperar por información que tal vez no sea necesaria. Así, disminuye el tiempo de espera del usuario y aumenta la utilidad de la app en redes lentas.
  • Para lograr esto, secuencia tus solicitudes de red a fin de obtener texto antes que rich media. Por lo general, las solicitudes de texto son más pequeñas, tienen una mejor compresión y, por lo tanto, se transfieren más rápido. Esto significa que tu app podrá mostrar contenido útil rápidamente. Para 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 red.

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. La detección de la calidad de la red y el ajuste de la forma en que la app la usa pueden ayudar a brindar una excelente experiencia del usuario.
  • Puedes usar los siguientes métodos para 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 usando la app en conexiones lentas. Cuando 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 Palette para generar colores de marcadores de posición que coincidan con la imagen deseada.
  • 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 para detectar la configuración del Ahorro de datos. Para obtener más información sobre esta función, consulta los datos del 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 de manera correspondiente. De esta forma, la app puede personalizar la experiencia del usuario según 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 cantidad y el tamaño de las solicitudes. A medida que mejore la calidad de la conexión, podrás aumentar las solicitudes para alcanzar niveles óptimos.
  • En redes de mayor calidad y sin medición de uso, se recomienda buscar los datos con anticipación para que estén disponibles con anterioridad. Desde el punto de vista de la experiencia del usuario, esto puede implicar que las apps de noticias obtengan tres artículos a la vez en 2G, pero logren capturar veinte en Wi-Fi. Para obtener más información sobre cómo 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 para recibir esta transmisión. Tras recibir la transmisión, debes revaluar el estado de la red actual y adaptar tu IU y el uso de la red de manera acorde. 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. Para obtener más información sobre este y otros cambios en Android 7.0, consulta Cambios en Android 7.0.