Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Conectividade para bilhões

Mais da metade dos usuários em todo o mundo experimentará seu aplicativo em uma conexão 2G. Para melhorar a experiência deles, otimize as conexões de baixa velocidade e o trabalho off-line, armazenando dados, enfileirando solicitações e manipulando imagens para um desempenho ideal.

Aqui você pode encontrar algumas dicas sobre como realizar essas ações.

Otimizar imagens

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

Exiba imagens do WebP

  • Exiba imagens do WebP na rede para reduzir os tempos de carregamento e economizar a largura de banda. Um arquivo WebP é geralmente menor em tamanho do que as contrapartes PNG e JPG, com pelo menos a mesma qualidade de imagem. Mesmo usando configurações com perda, o WebP pode produzir uma imagem quase idêntica à original. O Android oferece suporte a WebP com perda desde a versão o 4.0 (nível de API 14: Ice Cream Sandwich) e para WebP sem perda e transparente desde o Android 4.2 (nível de API 17: Jelly Bean).

Ajustar dinamicamente o tamanho das imagens

  • Faça com que seus aplicativos solicitem imagens no tamanho de renderização de destino, com base na especificação do dispositivo, e seu servidor forneça imagens de tamanho adequado. Isso minimiza a quantidade de dados enviados pela rede, bem como a memória necessária para conter cada imagem, resultando em melhor desempenho e usuários mais satisfeitos.
  • A experiência do usuário se torna insatisfatória quando é preciso aguardar o download das imagens. O uso de tamanhos apropriados de imagens ajuda a solucionar esse problema. Considere realizar solicitações de tamanho de imagens com base no tipo ou na qualidade da rede; esse tamanho poderá ser menor do que o tamanho de renderização de destino.
  • Marcadores dinâmicos como valores de paleta pré-computados ou miniaturas de baixa resolução podem melhor a experiência do usuário enquanto a imagem está sendo recuperada.

Usar bibliotecas de carregamento de imagens

  • Seu aplicativo não deve precisar recuperar uma imagem mais de uma vez. Bibliotecas de carregamento de imagens como Glide e Picasso recuperam a imagem, armazenam em cache e fornecem vínculos para suas visualizações para mostrar imagens de marcador até que as imagens reais estejam prontas. Como as imagens são armazenadas em cache, essas bibliotecas retornam a cópia local na próxima vez em que ela for solicitada.
  • Bibliotecas de carregamento de imagens armazenam os próprios caches, retendo as imagens mais recentes para que o armazenamento do seu aplicativo não expanda indefinidamente.

Otimizar rede

Você pode melhorar a experiência do usuário fornecendo uma experiência de rede ideal. Por exemplo, você pode permitir o uso off-line do seu aplicativo, usar o GcmNetworkManager e provedores de conteúdo e desduplicar as solicitações de rede.

Permitir o uso off-line do seu aplicativo

  • Na zona rural e em áreas menos afluentes, é comum que os dispositivos percam conectividade de rede. Criar um estado off-line útil significa que os usuários podem interagir com seu aplicativo a todo momento. Faça isso armazenando dados localmente, em cache e enfileirando solicitações de saída para ação quando a conectividade é restaurada.
  • Quando possível, os aplicativos não devem notificar os usuários de que a conectividade foi perdida. O usuário só deve ser notificado da perda da conectividade ao executar uma operação para a qual a conectividade é essencial.
  • Quando um dispositivo não tem conectividade, seu aplicativo deve 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 existentes mesmo que o dispositivo esteja off-line. Essas operações podem ser armazenadas em cache e executadas quando a conectividade for restaurada. Dessa forma, o aplicativo pode fornecer uma experiência do usuário semelhante independentemente de o dispositivo estar conectado ou não.

Usar o GcmNetworkManager e provedores de conteúdo

  • Garanta que seu aplicativo armazene todos os dados em disco por meio de um banco de dados ou uma estrutura similar para que seu desempenho seja adequado independentemente das condições de rede (por exemplo, via SQLite + ContentProvider). O GCM Network Manager (GcmNetworkManager) pode oferecer um mecanismo robusto para sincronizar dados com servidores enquanto provedores de conteúdo (ContentProvider) armazenam esses dados em cache. Ao combinar esses recursos, você pode ter uma arquitetura que oferece um estado off-line útil.
  • Os aplicativos devem armazenar em cache qualquer conteúdo recuperado da rede. Antes de fazer solicitações subsequentes, os aplicativos devem exibir os dados armazenados em cache localmente. Isso garante que o aplicativo seja funcional mesmo com o dispositivo off-line ou em uma rede lenta ou não confiável.

Desduplicar 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 o restante das solicitações subsequentes sendo atendidas localmente. Para fazer isso, use um banco de dados local para dados de longo prazo (usualmente android.database.sqlite ou SharedPreferences).
  • Esse tipo de arquitetura também simplifica o fluxo de um aplicativo entre os estados on-line e off-line, já que um estado recupera dados da rede para o cache, e 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. Dados que normalmente não são alterados só devem ser solicitados uma vez pela rede e armazenados em cache para usos futuros. Exemplos desse tipo de dados são imagens e documentos atemporais, como artigos de notícia e publicações sociais.

Aprimorar a transferência de dados

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

Priorizar a largura de banda

  • Você não deve presumir que qualquer rede conectada ao dispositivo é duradoura ou confiável. Por isso, os aplicativos devem priorizar 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 consiste em uma experiência de usuário melhor do que fazê-lo esperar informações que podem não ser necessárias. Isso reduz o tempo de espera do usuário e aumenta a utilidade do aplicativo em redes lentas.
  • Para fazer isso, sequencie as solicitações de rede de forma que o texto seja recuperado antes de elementos de rich media. Solicitações de texto tendem a ser menores e melhor compactadas, portanto, sua transferência é mais rápida, o que significa que seu aplicativo 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.

Use menos largura de banda em conexões mais lentas

  • A capacidade do seu aplicativo de transferir dados de forma rápida depende da conexão de rede. Detectar a qualidade da rede e ajustar a forma como seu aplicativo a usa pode ajudar a oferecer uma experiência excelente ao usuário.
  • Você pode utilizar os métodos a seguir para detectar a qualidade da rede. Ao usar dados desses métodos, seu aplicativo deve adaptar seu uso da rede para continuar fornecendo respostas rápidas para as ações do usuário:
  • Em conexões mais lentas, considere fazer o download apenas de mídia de baixa resolução ou de nenhuma mídia. Isso garante que os usuários possam usar o aplicativo em conexões lentas. Em casos nos quais você não tem uma imagem ou a imagem ainda está sendo carregada, mostre sempre um marcador. É possível criar um marcador dinâmico usando a biblioteca de paleta para gerar cores de marcadores que correspondam à imagem de destino.
  • Em dispositivos com Android 7.0 (API de nível 24) e posteriores, os usuários podem ativar a configuração Economia de dados, que ajuda a minimizar o uso de dados. O Android 7.0 amplia o ConnectivityManager para detectar configurações da Economia de dados. Para obter mais informações sobre este recurso, consulte Economia de dados.

Detecte mudanças na rede e altere o comportamento do aplicativo

  • 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 aplicativos devem detectar mudanças na rede e ajustar a largura de banda de forma apropriada. Ao fazer isso, seu aplicativo 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 é reduzida, você deve reduzir o número e o tamanho das solicitações. Quando a qualidade melhorar, você poderá ampliar suas solicitações até atingir o nível ideal.
  • Em redes ilimitadas de alta qualidade, considere pré-armazenar dados em cache para disponibilizá-los antecipadamente. Da perspectiva da experiência do usuário, isso pode significar que aplicativos de leitura de notícias recuperam três artigos por vez em uma conexão 2G, mas 20 artigos por vez ao usar Wi-Fi. Para saber mais sobre como ajustar o comportamento do aplicativo 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 aplicativo estiver em primeiro plano, você poderá chamar registerReceiver para receber essa transmissão. Após receber a transmissão, reavalie o estado atual da rede e ajuste sua interface e uso da rede da forma adequada. Você não deve declarar este receptor no manifesto, já que esse recurso não está disponível no Android 7.0 (API de nível 24) nem em posteriores. Para obter mais informações sobre esta e outras mudanças do Android 7.0, consulte Mudanças do Android 7.0.