Conectividade para bilhões

Mais da metade dos usuários no todo o mundo usará seu app em uma conexão 2G. Para melhorar a experiência deles, otimize-o para conexões de baixa velocidade e para o funcionamento off-line, armazenando dados, enfileirando solicitações e gerenciando imagens de modo a oferecer um desempenho ideal.

Aqui, você encontrará algumas dicas sobre como fazer isso.

Otimizar imagens

Há várias maneiras de facilitar o download de imagens. Isso inclui a exibição de imagens WebP, o dimensionamento dinâmico e o uso de bibliotecas de carregamento de imagens.

Exibir imagens WebP

  • Exiba arquivos WebP na rede para reduzir os tempos de carregamento de imagem e economizar a largura de banda. Um arquivo WebP geralmente é menor do que um PNG ou JPG e tem, no mínimo, a mesma qualidade de imagem. Mesmo usando configurações com perda, o WebP pode produzir uma imagem quase idêntica à original. O Android inclui a compatibilidade com WebP com perda desde a versão 4.0 (API de nível 14: Ice Cream Sandwich) e com o WebP transparente sem perda desde o Android 4.2 (API de nível 17: Jelly Bean).

Ajustar dinamicamente o tamanho das imagens

  • Faça com que seus apps solicitem imagens no tamanho de renderização de destino, com base na especificação do dispositivo, e com que seu servidor forneça imagens de tamanho adequado. Isso minimiza a quantidade de dados enviados pela rede, além de reduzir a quantidade de memória necessária para conter cada imagem, resultando em melhor desempenho e em usuários mais satisfeitos.
  • A experiência do usuário é prejudicada quando ele precisa aguardar o download das imagens. O uso de tamanhos de imagem apropriados ajuda a solucionar esses problemas. Recomendamos fazer solicitações de tamanho de imagem com base no tipo ou na qualidade da rede. Esse tamanho poderá ser menor do que o da renderização de destino.
  • Marcadores dinâmicos como valores de paleta pré-computados ou miniaturas de baixa resolução podem melhorar a experiência do usuário enquanto a imagem está sendo buscada.

Usar bibliotecas de carregamento de imagens

  • Seu app não deve buscar uma imagem mais de uma vez. As bibliotecas de carregamento de imagens, como a Glide e a Picasso (links em inglês), buscam a imagem, armazenam em cache e fornecem hooks para suas visualizações para mostrar imagens de marcador até que as imagens reais estejam prontas. Como ocorre o armazenamento em cache, essas bibliotecas retornam a cópia local na próxima vez em que a imagem é solicitada.
  • Bibliotecas de carregamento de imagens gerenciam os próprios caches, retendo as imagens mais recentes para que o armazenamento do seu app não aumente indefinidamente.

Otimizar a rede

É possível melhorar a experiência do usuário fornecendo uma experiência de rede ideal. Por exemplo, você pode permitir que seu app seja usado off-line, pode usar a WorkManager e a Room e pode eliminar a duplicação de solicitações de rede.

Permitir o uso off-line do app

  • Na zona rural e em áreas menos abastadas, é comum que os dispositivos percam conectividade de rede. Com a criação de um estado off-line útil, os usuários podem interagir com seu app a qualquer momento. Faça isso armazenando dados localmente e em cache e enfileirando solicitações de saída para entrarem em ação quando a conectividade for restaurada.
  • Quando possível, é indicado que os apps não avisem aos usuários que a conectividade foi perdida. O usuário só precisa ser avisado sobre a perda de conectividade ao executar uma operação para a qual ela seja essencial.
  • Quando um dispositivo estiver sem conectividade, o app precisará criar lotes de solicitações de rede (em nome do usuário) para que elas possam ser executadas quando a conectividade for restaurada. Um exemplo disso é um cliente de e-mail que permite que os usuários escrevam, enviem, leiam, movam e excluam e-mails mesmo que o dispositivo esteja off-line. Essas operações podem ser armazenadas em cache e executadas quando a conectividade for restaurada. Assim, o app pode oferecer uma experiência do usuário semelhante independentemente de o dispositivo estar on ou off-line.

Usar a Room para buscar e armazenar dados em cache

  • O app precisa armazenar todos os dados em disco usando um banco de dados ou uma estrutura parecida para que o desempenho dele seja adequado independentemente das condições da rede. Use a biblioteca de persistência Room para armazenar dados em cache em um banco de dados local e use a WorkManager para atualizar esse cache quando o dispositivo tiver uma conexão de rede.
  • Os apps precisam armazenar em cache qualquer conteúdo buscado na rede. Antes de fazer outras solicitações, eles precisam exibir os dados armazenados em cache localmente. Isso garante que o app seja funcional mesmo com o dispositivo off-line ou em uma rede lenta ou não confiável.

Eliminar a duplicação de solicitações de rede

  • Uma arquitetura que prioriza o modo off-line inicialmente tenta recuperar dados do armazenamento local e, quando isso não é possível, solicita os dados da rede. Após serem recuperados da rede, os dados são armazenados em cache localmente para recuperações futuras. Isso ajuda a garantir que as solicitações de rede para os mesmos dados só ocorram uma vez, com as solicitações seguintes sendo atendidas localmente. Para fazer isso, use um banco de dados local para dados de longo prazo (geralmente android.database.sqlite ou SharedPreferences).
  • Esse tipo de arquitetura também simplifica o fluxo de um app entre os estados on e off-line, já que um estado busca dados da rede para o cache, enquanto o outro recupera dados do cache para apresentá-los ao usuário.
  • Para dados temporários, use um cache em disco associado, como um DiskLruCache (link em inglês). Dados que não costumam mudar só precisam ser solicitados uma vez pela rede e depois ser armazenados em cache para uso futuro. Exemplos desse tipo de dado são imagens e documentos atemporais, como matérias e postagens em redes sociais.

Aprimorar a transferência de dados

Existem várias maneiras de seu app se adaptar às condições da rede para proporcionar uma melhor experiência para o usuário. Por exemplo, ele pode priorizar solicitações de rede para minimizar o tempo de espera de informações para o usuário. Ele também pode detectar e se adaptar a velocidades de rede mais lentas e mudanças que podem ocorrer na conexão de rede.

Priorizar a largura de banda

  • Não é possível presumir que as redes conectadas ao dispositivo são duradouras ou confiáveis. Por isso, os apps precisam priorizar as solicitações de rede para exibir as informações mais úteis aos usuários assim que possível.
  • Apresentar aos usuários informações visíveis e relevantes imediatamente proporciona uma experiência melhor do que fazê-los esperar por informações que podem não ser necessárias. Isso reduz o tempo de espera do usuário e aumenta a utilidade do app em redes lentas.
  • Para conseguir esse resultado, sequencie as solicitações de rede de forma que o texto seja buscado antes de elementos rich media. As solicitações de texto tendem a ser menores e melhor compactadas, o que deixa sua transferência mais rápida e significa que seu app pode exibir conteúdo relevante com rapidez. Para saber mais sobre como gerenciar solicitações de rede, acesse o treinamento do Android sobre como Gerenciar o uso da rede.

Usar menos largura de banda em conexões mais lentas

  • A capacidade do seu app para transferir dados de forma rápida depende da conexão de rede. Detectar a qualidade da rede e ajustar a forma como o app a usa pode ajudar a oferecer uma experiência excelente ao usuário.
  • Você pode aplicar os métodos a seguir para detectar a qualidade da rede. Ao usar os dados desses métodos, seu app precisará adaptar o uso que ele faz da rede para continuar fornecendo respostas rápidas para as ações do usuário:
  • Em conexões mais lentas, recomendamos o download apenas de mídias com baixa resolução ou até de nenhuma mídia. Isso garante que os usuários possam usar o app em conexões lentas. Quando você não tiver uma imagem ou a imagem ainda estiver sendo carregada, mostre sempre um marcador. É possível criar um marcador dinâmico usando a biblioteca Palette para gerar cores de marcadores que correspondam à imagem de destino.
  • Em dispositivos com Android 7.0 (API de nível 24) e mais recentes, os usuários podem ativar a configuração Economia de dados, que ajuda a minimizar o uso de dados. O Android 7.0 amplia a classe ConnectivityManager para detectar configurações da Economia de Dados. Para saber mais sobre esse recurso, consulte Economia de dados.

Detectar mudanças na rede e trocar o comportamento do app

  • A qualidade da rede não é estática. Ela muda de acordo com a localização, o tráfego de rede e a densidade da população local. Os apps precisam detectar mudanças na rede e ajustar a largura de banda de forma adequada. Ao fazer isso, seu app pode adaptar a experiência do usuário à qualidade da rede. Detecte o estado da rede usando os seguintes métodos:
  • Conforme a qualidade da rede diminui, você precisa reduzir o número e o tamanho das solicitações. Quando a qualidade melhorar, você poderá aumentar suas solicitações até atingir o nível ideal.
  • Em redes ilimitadas e de alta qualidade, recomendamos fazer a pré-busca de dados para disponibilizá-los antecipadamente. Da perspectiva da experiência do usuário, isso pode significar que apps de leitura de notícias buscam 3 artigos por vez em uma conexão 2G, mas 20 por vez ao usar Wi-Fi. Para saber mais sobre como ajustar o comportamento do app com base nas mudanças da rede, acesse o treinamento do Android sobre como Monitorar o status da conectividade.
  • A transmissão CONNECTIVITY_CHANGE é enviada quando ocorre uma mudança na conectividade da rede. Quando seu app estiver em primeiro plano, você poderá chamar registerReceiver para receber essa transmissão. Depois de receber a transmissão, reavalie o estado atual da rede e ajuste a IU e o uso da rede de forma adequada. Você não precisa declarar esse receptor no manifesto, já que ele está indisponível no Android 7.0 (API de nível 24) e em versões mais recentes. Para saber mais sobre essa e outras mudanças do Android 7.0, consulte Alterações do Android 7.0.

Outros recursos

Para saber mais sobre como oferecer compatibilidade com várias velocidades de conexão, consulte o seguinte recurso:

Postagem do blog