Cómo evitar las descargas no optimizadas

Algunos de los usuarios de tu app tienen acceso intermitente a Internet o tienen límites sobre la cantidad de información que pueden descargar en sus dispositivos. Puedes para alentar a los usuarios a interactuar con la app más a menudo reduciendo la cantidad de datos que tu app necesita descargar.

La forma más simple de reducir las descargas es descargar solo lo que que necesitan tus usuarios. En términos de datos, eso significa implementar APIs de REST que te permiten especificar criterios de consulta que limitan los datos devueltos con parámetros como la hora de la última actualización.

Del mismo modo, cuando descargas imágenes, conviene reducir el tamaño de imágenes del servidor, en lugar de descargar imágenes de tamaño completo en el cliente.

Almacena en caché las respuestas HTTP

Otra técnica importante es evitar la descarga de datos duplicados. Puedes la probabilidad de descargar los mismos datos repetidas veces mediante el almacenamiento en caché. Al almacenar en caché los datos y recursos de tu app, creas una copia local de la información a la que la aplicación debe hacer referencia. Si tu app necesita acceder la misma información varias veces en un período corto, necesitas para descargarlo en caché solo una vez.

Es importante almacenar en caché de la forma más agresiva posible para reducir la cantidad de datos que descargas. Siempre almacena en caché los recursos estáticos, como descargas on demand, como imágenes de tamaño completo, durante un período razonable como sea posible. Los recursos a pedido deben almacenarse por separado para permitirte vaciará con regularidad tu caché según demanda para administrar su tamaño.

Para garantizar que el almacenamiento en caché no muestre datos obsoletos en tu app, sigue estos pasos: utiliza los códigos de estado HTTP correctos y encabezados como el ETag y Last-Modified encabezados. Esto te permite determinar cuándo se debe actual. Por ejemplo:

Kotlin

// url represents the website containing the content to place into the cache.
val conn: HttpsURLConnection = url.openConnection() as HttpsURLConnection
val currentTime: Long = System.currentTimeMillis()
val lastModified: Long = conn.getHeaderFieldDate("Last-Modified", currentTime)

// lastUpdateTime represents when the cache was last updated.
if (lastModified < lastUpdateTime) {
    // Skip update
} else {
    // Parse update
    lastUpdateTime = lastModified
}

Java

// url represents the website containing the content to place into the cache.
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
long currentTime = System.currentTimeMillis();
long lastModified = conn.getHeaderFieldDate("Last-Modified", currentTime);

// lastUpdateTime represents when the cache was last updated.
if (lastModified < lastUpdateTime) {
    // Skip update
} else {
    // Parse update
    lastUpdateTime = lastModified;
}

Puedes configurar algunas bibliotecas de red para que respeten estos códigos de estado encabezados automáticamente. Al usar OkHttp, por ejemplo, configurar un directorio de caché y un tamaño de caché para el cliente, permitirá que la biblioteca use Almacenamiento en caché HTTP, como se puede ver en la siguiente muestra de código:

Kotlin

val cacheDir = Context.getCacheDir()
val cacheSize = 10L * 1024L * 1024L // 10 MiB
val client: OkHttpClient = OkHttpClient.Builder()
    .cache(Cache(cacheDir, cacheSize))
    .build()

Java

File cacheDir = Context.getCacheDir();
long cacheSize = 10L * 1024L * 1024L; // 10 MiB
OkHttpClient client = new OkHttpClient.Builder()
    .cache(new Cache(cacheDir, cacheSize))
    .build();

Con la caché configurada, puedes entregar solicitudes HTTP almacenadas en caché por completo directamente desde el almacenamiento local, lo que elimina la necesidad de abrir una conexión de red. Las respuestas almacenadas en caché condicionalmente pueden validar su actualización desde el servidor, eliminando el costo de ancho de banda asociado con la descarga. Respuestas no almacenadas en caché se almacenarán en la caché de respuestas para futuras solicitudes.

Puedes almacenar en caché datos no sensibles en el directorio de caché externa no administrada. Para ello, haz lo siguiente: mediante Context.getExternalCacheDir() Como alternativa, puedes almacenar datos en la caché de aplicaciones administrada y segura mediante mediante Context.getCacheDir() Ten en cuenta que esta caché interna se puede vaciar cuando el sistema se está quedando sin batería almacenamiento disponible.

Usa un repositorio

Para un enfoque más sofisticado sobre el almacenamiento en caché, considera el uso de . Esto implica crear una clase personalizada, conocida como repositorio, que proporciona una abstracción de la API sobre algunos datos o recursos específicos. El repositorio puede recuperar inicialmente sus datos de varias fuentes, como un servicio web remoto, pero brinda a los emisores una versión almacenada en caché de los datos en las llamadas posteriores. Esta capa de indirección te permite proporcionar una estrategia sólida de almacenamiento en caché específicas de tu app. Para obtener más información sobre el uso del patrón de repositorio dentro de tu aplicación, consulta la Guía de aplicaciones arquitectura.