Estou usando um ListView
para exibir algumas imagens e legendas associadas a essas imagens. Estou recebendo as imagens da Internet. Existe uma maneira de carregar imagens preguiçosamente e, enquanto o texto é exibido, a interface do usuário não é bloqueada e as imagens são exibidas durante o download?
O número total de imagens não é fixo.
setUrl
.Respostas:
Aqui está o que eu criei para armazenar as imagens que meu aplicativo está exibindo no momento. Observe que o objeto "Log" em uso aqui é meu invólucro personalizado em torno da classe final do Log dentro do Android.
fonte
LRU Cache
developer.android.com/training/displaying-bitmaps/…Fiz uma demonstração simples de uma lista lenta (localizada no GitHub) com imagens.
Pode ser útil para alguém. Ele baixa imagens no segmento de segundo plano. As imagens estão sendo armazenadas em cache no cartão SD e na memória. A implementação do cache é muito simples e é suficiente para a demonstração. Decodifico imagens com o inSampleSize para reduzir o consumo de memória. Também tento lidar com visualizações recicladas corretamente.
fonte
Eu recomendo o Universal Image Loader de instrumento de código aberto . Ele é originalmente baseado no projeto LazyList, de Fedor Vlasov, e foi amplamente aprimorado desde então.
fonte
Multithreading For Performance , um tutorial de Gilles Debunne.
Isso é do Blog dos desenvolvedores do Android. O código sugerido usa:
AsyncTasks
.FIFO cache
.garbage collect
cache macio e de fácil instalação .Drawable
enquanto você baixa.fonte
Atualização: observe que esta resposta é bastante ineficaz agora. O Garbage Collector atua de forma agressiva no SoftReference e no WeakReference, portanto esse código NÃO é adequado para novos aplicativos. (Em vez disso, tente bibliotecas como o Universal Image Loader sugeridas em outras respostas.)
Agradecemos a James pelo código e a Bao-Long pela sugestão de usar o SoftReference. Eu implementei as alterações do SoftReference no código de James. Infelizmente, o SoftReferences fez com que minhas imagens fossem coletadas como lixo muito rapidamente. No meu caso, não houve problemas com o SoftReference, porque meu tamanho de lista é limitado e minhas imagens são pequenas.
Há uma discussão de um ano atrás sobre as SoftReferences nos grupos do google: link to thread . Como solução para a coleta de lixo muito cedo, eles sugerem a possibilidade de definir manualmente o tamanho de heap da VM usando dalvik.system.VMRuntime.setMinimumHeapSize (), o que não é muito atraente para mim.
fonte
Picasso
Use a Biblioteca Picasso de Jake Wharton. (Uma perfeita biblioteca ImageLoading do desenvolvedor do ActionBarSherlock)
Uma poderosa biblioteca de download e cache de imagens para Android.
As imagens adicionam contexto e talento visual necessários aos aplicativos Android. O Picasso permite o carregamento de imagens sem problemas no seu aplicativo - geralmente em uma linha de código!
Muitas armadilhas comuns do carregamento de imagens no Android são tratadas automaticamente pelo Picasso:
Manuseando a reciclagem do ImageView e cancelando o download em um adaptador. Transformações de imagem complexas com uso mínimo de memória. Memória automática e cache de disco.
Biblioteca de Picasso Jake Wharton
Deslizar
O Glide é uma estrutura de gerenciamento de mídia de código aberto rápida e eficiente para Android que agrupa decodificação de mídia, cache de memória e disco e pool de recursos em uma interface simples e fácil de usar.
O Glide suporta a busca, decodificação e exibição de vídeos, imagens e GIFs animados. O Glide inclui uma API flexível que permite que os desenvolvedores se conectem a praticamente qualquer pilha de rede. Por padrão, o Glide usa uma pilha personalizada baseada em HttpUrlConnection, mas também inclui bibliotecas de utilitários conectadas ao projeto Volley do Google ou a biblioteca OkHttp da Square.
O foco principal do Glide é tornar a rolagem de qualquer tipo de lista de imagens o mais suave e rápida possível, mas o Glide também é eficaz para quase todos os casos em que você precisa buscar, redimensionar e exibir uma imagem remota.
Biblioteca de carregamento de imagens Glide
Fresco pelo Facebook
Fresco é um sistema poderoso para exibir imagens em aplicativos Android.
O Fresco cuida do carregamento e exibição da imagem, para que você não precise. Ele carrega imagens da rede, armazenamento local ou recursos locais e exibe um espaço reservado até a imagem chegar. Possui dois níveis de cache; um na memória e outro no armazenamento interno.
Fresco Github
No Android 4.xe inferior, o Fresco coloca as imagens em uma região especial da memória do Android. Isso permite que seu aplicativo seja executado mais rapidamente - e sofra o temido OutOfMemoryError com muito menos frequência.
Documentação Fresco
fonte
Carregador de alto desempenho - depois de examinar os métodos sugeridos aqui, usei a solução de Ben com algumas alterações -
Eu percebi que trabalhar com drawables é mais rápido que com bitmaps, então eu uso drawables
O uso do SoftReference é ótimo, mas faz com que a imagem em cache seja excluída com muita frequência; por isso, adicionei uma lista vinculada que contém referências de imagens, impedindo que a imagem seja excluída, até atingir um tamanho predefinido.
Para abrir o InputStream, usei java.net.URLConnection, que me permite usar o cache da web (você precisa definir um cache de resposta primeiro, mas isso é outra história)
Meu código:
fonte
import java.util.Map; import java.util.HashMap; import java.util.LinkedList; import java.util.Collections; import java.util.WeakHashMap; import java.lang.ref.SoftReference; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import android.graphics.drawable.Drawable; import android.widget.ImageView; import android.os.Handler; import android.os.Message; import java.io.InputStream; import java.net.MalformedURLException; import java.io.IOException; import java.net.URL; import java.net.URLConnection;
Eu segui este treinamento do Android e acho que ele faz um excelente trabalho no download de imagens sem bloquear a interface do usuário principal. Ele também lida com o cache e com a rolagem de muitas imagens: Carregamento de bitmaps grandes com eficiência
fonte
1. O Picasso permite o carregamento de imagens sem problemas no seu aplicativo - geralmente em uma linha de código!
Use Gradle:
Apenas uma linha de código!
2. Planar Uma biblioteca de carregamento e armazenamento de imagens para Android focada em rolagem suave
Use Gradle:
// Para uma visão simples:
3. fresco é um sistema poderoso para a exibição de imagens em aplicativos Android . O Fresco cuida do carregamento e exibição da imagem, para que você não precise.
Introdução ao Fresco
fonte
Eu escrevi um tutorial que explica como fazer o carregamento lento de imagens em uma lista. Entro em alguns detalhes sobre os problemas de reciclagem e concorrência. Eu também uso um pool de threads fixo para evitar a geração de muitos threads.
Carregamento lento de imagens no Tutorial do Listview
fonte
A maneira como faço isso é iniciando um thread para baixar as imagens em segundo plano e entregá-lo um retorno de chamada para cada item da lista. Quando o download de uma imagem termina, ele chama o retorno de chamada, que atualiza a exibição do item da lista.
Esse método não funciona muito bem quando você está reciclando visualizações.
fonte
Eu só quero adicionar mais um bom exemplo, XML Adapters . Como é usado pelo Google, também estou usando a mesma lógica para evitar um erro OutOfMemory.
Basicamente, este ImageDownloader é a sua resposta (pois cobre a maioria dos seus requisitos). Alguns você também pode implementar nisso.
fonte
Este é um problema comum no Android que foi resolvido de várias maneiras por muitas pessoas. Na minha opinião, a melhor solução que eu já vi é a relativamente nova biblioteca chamada Picasso . Aqui estão os destaques:
Jake Wharton
do ActionBarSherlock .ListView
Detecção automáticafonte
Estou usando o NetworkImageView da nova Android Volley Library
com.android.volley.toolbox.NetworkImageView
, e parece estar funcionando muito bem. Aparentemente, essa é a mesma visualização usada no Google Play e em outros novos aplicativos do Google. Definitivamente vale a pena conferir.Tutorial de cache de imagens de vôlei do Google I / O 2013
Eventos do Google para desenvolvedores
fonte
Bem, o tempo de carregamento da imagem na Internet tem muitas soluções. Você também pode usar a biblioteca Android-Query . Isso lhe dará toda a atividade necessária. Certifique-se de que você deseja fazer e leia a página wiki da biblioteca. E resolva a restrição de carregamento da imagem.
Este é o meu código:
Deve resolver o seu problema de carregamento lento.
fonte
Acho que esse problema é muito popular entre os desenvolvedores do Android, e existem muitas dessas bibliotecas que pretendem resolver esse problema, mas apenas algumas delas parecem estar em risco. O AQuery é uma dessas bibliotecas, mas é melhor que a maioria em todos os aspectos e vale a pena tentar.
fonte
Você deve tentar este Universal Loader é o melhor. Estou usando isso depois de fazer muitos RnD em carregamento lento.
Carregador Universal de Imagens
Recursos
Suporte para Android 2.0 ou superior
fonte
Dê uma olhada no Shutterbug , a porta SDWebImage (uma boa biblioteca no iOS) do Applidium para Android. Ele suporta armazenamento em cache assíncrono, armazena URLs com falha, lida bem com a concorrência e subclasses úteis são incluídas.
Pedidos pull (e relatórios de bugs) também são bem-vindos!
fonte
O DroidParts possui o ImageFetcher que requer configuração zero para começar.
Clone o DroidPartsGram por um exemplo:
fonte
Apenas uma dica rápida para alguém indeciso sobre qual biblioteca usar para imagens de carregamento lento:
Existem quatro maneiras básicas.
DIY => Não é a melhor solução, mas para algumas imagens e se você quiser ficar sem o incômodo de usar outras bibliotecas
Biblioteca de carregamento preguiçoso do Volley => De caras no android. É bom e tudo, mas está mal documentado e, portanto, é um problema para usar.
Picasso: Uma solução simples que simplesmente funciona, você pode até especificar o tamanho exato da imagem que deseja trazer. É muito simples de usar, mas pode não ser muito "eficiente" para aplicativos que precisam lidar com quantidades enormes de imagens.
UIL: A melhor maneira de carregar imagens com preguiça. Você pode armazenar em cache imagens (é claro que precisa de permissão), inicializar o carregador uma vez e concluir seu trabalho. A biblioteca de carregamento de imagem assíncrona mais madura que eu já vi até agora.
fonte
O Novoda também possui uma ótima biblioteca de carregamento de imagens preguiçosas e muitos aplicativos como Songkick, Podio, SecretDJ e ImageSearch usam sua biblioteca.
A biblioteca deles está hospedada aqui no Github e eles também têm um rastreador de problemas bastante ativo . O projeto deles também parece bastante ativo, com mais de 300 confirmações no momento em que escrevemos essa resposta.
fonte
Verifique meu garfo do LazyList . Basicamente, eu melhoro o LazyList atrasando a chamada do ImageView e crio dois métodos:
Também aprimorei o ImageLoader implementando um singleton neste objeto.
fonte
Se você deseja exibir o layout Shimmer como o Facebook, existe uma biblioteca oficial do facebook para isso. FaceBook Shimmer Android
Ele cuida de tudo. Você só precisa colocar o código de design desejado de maneira aninhada no quadro shimmer. Aqui está um código de exemplo.
E aqui está o código java para ele.
Adicione essa dependência ao seu arquivo gradle.
Aqui está como ele se parece.
fonte
Todo o código acima tem seu próprio valor, mas com a minha experiência pessoal, experimente o Picasso.
Picasso é uma biblioteca especificamente para esse fim, na verdade, ele gerenciará o cache e todas as outras operações de rede automaticamente. Você precisará adicionar uma biblioteca ao seu projeto e apenas escrever uma única linha de código para carregar a imagem do URL remoto.
Por favor, visite aqui: http://code.tutsplus.com/tutorials/android-sdk-working-with-picasso--cms-22149
fonte
Use a biblioteca glide. Ele funcionou para mim e também funcionará para o seu código. Funciona tanto para imagens quanto para gifs também.
fonte
Posso recomendar uma maneira diferente que funciona como um encanto: Consulta Android.
Você pode baixar esse arquivo JAR aqui
Como um exemplo:
É muito rápido e preciso e, usando isso, você pode encontrar muitos outros recursos, como animação ao carregar, obter um bitmap (se necessário) etc.
fonte
Experimente o Aquery . Possui métodos incrivelmente simples para carregar e armazenar em cache imagens de forma assíncrona.
fonte
O URLImageViewHelper é uma biblioteca incrível que ajuda você a fazer isso.
fonte
fonte
Eu tive esse problema e implementei o lruCache. Acredito que você precise da API 12 ou superior ou use a biblioteca v4 compatível. O lurCache é uma memória rápida, mas também possui um orçamento, portanto, se você estiver preocupado com isso, poderá usar um cache de disco ... Está tudo descrito em Caching Bitmaps .
Agora fornecerei minha implementação, que é um singleton que chamo de qualquer lugar como este:
Aqui está o código ideal para armazenar em cache e, em seguida, chame o acima no getView de um adaptador ao recuperar a imagem da web:
fonte