Alguns usuários do seu app têm acesso intermitente à Internet ou limites na quantidade de informações que podem baixar nos dispositivos. Você pode incentivar os usuários a interagir com o app com mais frequência reduzindo a quantidade de dados que o app precisa baixar.
A maneira mais fundamental de reduzir os downloads é baixar apenas o que você precisa. Em termos de dados, isso significa implementar APIs REST que permitem especificar critérios de consulta que limitam os dados retornados usando parâmetros como o horário da última atualização.
Da mesma forma, ao fazer o download de imagens, é recomendável reduzir o tamanho delas do lado do servidor, em vez de fazer o download de imagens em tamanho original que são reduzidas no cliente.
Armazenar respostas HTTP em cache
Outra técnica importante é evitar o download de dados duplicados. É possível reduzir a probabilidade de baixar os mesmos dados repetidamente usando o armazenamento em cache. Ao armazenar em cache os dados e recursos do app, você cria uma cópia local das informações que o app precisa consultar. Se o app precisar acessar as mesmas informações várias vezes em um curto período, será necessário fazer o download delas no cache apenas uma vez.
É importante armazenar em cache o máximo possível para reduzir a quantidade total de dados que você faz o download. Sempre armazene em cache os recursos estáticos, incluindo downloads sob demanda, como imagens em tamanho original, pelo maior tempo possível. Os recursos sob demanda precisam ser armazenados separadamente para que você possa limpar regularmente o cache sob demanda para gerenciar o tamanho dele.
Para garantir que o armazenamento em cache não resulte na exibição de dados desatualizados pelo app,
use os códigos de status e cabeçalhos HTTP
adequados,
como os cabeçalhos
ETag
e
Last-Modified. Isso permite determinar quando o conteúdo associado precisa ser
atualizado. Exemplo:
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; }
É possível configurar algumas bibliotecas de rede para respeitar esses códigos de status e cabeçalhos automaticamente. Ao usar o OkHttp, por exemplo, configurar um diretório e um tamanho de cache para o cliente vai permitir que a biblioteca use o armazenamento em cache HTTP, conforme mostrado no exemplo de código a seguir:
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();
Com o cache configurado, é possível exibir solicitações HTTP totalmente armazenadas em cache diretamente do armazenamento local, eliminando a necessidade de abrir uma conexão de rede. As respostas armazenadas em cache condicionalmente podem validar o frescor no servidor, eliminando o custo de largura de banda associado ao download. As respostas não armazenadas em cache são armazenadas no cache de respostas para solicitações futuras.
É possível armazenar em cache dados não confidenciais no diretório de cache externo não gerenciado
usando
Context.getExternalCacheDir().
Como alternativa, é possível armazenar dados em cache no cache de aplicativo gerenciado e seguro usando
Context.getCacheDir().
Esse cache interno pode ser limpo quando o sistema estiver com pouco armazenamento disponível.
Usar um repositório
Para uma abordagem mais sofisticada de armazenamento em cache, considere o padrão de design de repositório. Isso envolve a criação de uma classe personalizada, conhecida como repositório, que fornece uma abstração de API sobre alguns dados ou recursos específicos. O repositório pode inicialmente buscar os dados de várias fontes, como um serviço da Web remoto, mas fornece aos autores das chamadas uma versão em cache dos dados nas chamadas subsequentes. Essa camada de indireção permite que você forneça uma estratégia de armazenamento em cache robusta e específica para seu app. Para mais informações sobre como usar o padrão do repositório no app, consulte o Guia para arquitetura do app.