English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Princípio de cache de imagens do Android, comparação de características

Este é o conteúdo que compartilhei no MDCC (com algumas mudanças), também foi介绍的 código-fonte no lançamento do primeiro episódio do código-fonte, e o código-fonte a ser feito gradualmente no futuro.

Comparar os conceitos de design geral e princípio de várias bibliotecas de cache de imagens, até mesmo aqueles que não usam suas amizades podem entender suas implementações em certas características.

Um: Informações básicas das quatro principais bibliotecas de cache de imagens


O Universal ImageLoader é um cache de imagens lançado cedo como código aberto, usado por muitos aplicativos no início.

O Picasso é um projeto de código aberto da Square, e seu líder é JakeWharton, portanto, é amplamente conhecido.

O Glide é um projeto de código aberto de funcionários da Google, usado por alguns aplicativos do Google, no Google I/Foi recomendado no Android O, mas ainda há poucos materiais disponíveis no Brasil.

O Fresco foi lançado como código aberto pela Facebook no primeiro semestre deste ano, e suas principais características incluem:
(1Dois caches de memória mais o cache nativo formam um cache de três níveis

(2Suporte a fluxo, pode ser semelhante à exibição gradual e borrada de imagens em páginas da web

(3Melhor suporte a animações de múltiplas frames, como Gif e WebP

Dado que o Fresco ainda não foi lançado oficialmente 1Versão 0, e ainda não tive muito tempo para familiarizar-me com o código-fonte do Fresco, então a comparação não incluiu o Fresco, que será adicionado à comparação no futuro, quando tiver tempo.

Mais bibliotecas de cache de imagens disponíveis: Bibliotecas de cache de imagens Android

Dois: Conceitos básicos

Antes de fazer comparações formais, vamos entender alguns conceitos comuns de cache de imagens:
(1RequestManager: Módulo de geração e gestão de solicitações

(2Engine: Parte do motor, responsável por criar tarefas (obter dados) e agendar sua execução

(3GetDataInterface: Interface de obtenção de dados, responsável por obter dados de várias fontes de dados.
Por exemplo, MemoryCache para obter dados do cache da memória, DiskCache para obter dados do cache local, e o downloader para obter dados da rede, etc.

(4Displayer: Recursos (imagens)显示器,usado para exibir ou operar recursos.
Por exemplo, ImageView, esses caches de imagens não suportam apenas ImageView, mas também suportam outros View e o conceito virtual de Displayer.

(5) Processor de recursos (imagens) processador
Responsável por processar recursos, como rotação, compressão, recorte, etc.

Os nomes desses conceitos podem variar em diferentes caches de imagens, por exemplo, o Displayer no ImageLoader é chamado de ImageAware, em Picasso e Glide é chamado de Target.

Terceiro, pontos comuns

1. Uso simples
Tudo pode ser feito com uma única linha de código, permitindo a obtenção e exibição de imagens.

2. Alta configurabilidade e alta adaptabilidade
O downloader de cache de imagens (mecanismo de retry), o decodificador, o显示器, o processador, o cache de memória, o cache local, a thread pool e os algoritmos de cache podem ser configurados facilmente.

Altamente adaptável, inicializando a configuração do cache com base no desempenho do sistema e ajustando dinamicamente a estratégia após a alteração das informações do sistema.
Por exemplo, determinar o número máximo de concorrências com base no número de núcleos da CPU, determinar o tamanho do cache de memória com base na memória disponível, ajustar o número máximo de concorrências conforme a mudança do estado da rede, etc.

3. Cache multissinal
Têm pelo menos dois níveis de cache, melhorando a velocidade de carregamento de imagens. 

4. Suporte a várias fontes de dados
Suporta várias fontes de dados, como rede, local, recursos, Assets, etc.

5. Suporte a múltiplos Displayer
Além de suportar ImageView, também suporta outros View e o conceito virtual de Displayer.

Outros pontos comuns incluem suporte a animações, suporte a transformações, obtenção de informações EXIF, etc.

Quarto, o design e as vantagens do ImageLoader

1. Design geral e fluxo

Aqui está o diagrama de design geral do ImageLoader. A biblioteca é dividida em cinco grandes módulos: ImageLoaderEngine, Cache e ImageDownloader, ImageDecoder, BitmapDisplayer e BitmapProcessor, onde o Cache é dividido em MemoryCache e DiskCache.

Em termos simples, é a ImageLoader que recebe a tarefa de carregar e exibir imagens, entregando-a ao ImageLoaderEngine, que distribui a tarefa para a thread pool específica para execução, a tarefa obtém a imagem através do Cache e ImageDownloader, que pode passar pelo BitmapProcessor e ImageDecoder para processamento, antes de ser convertida em Bitmap e entregue ao BitmapDisplayer para exibição no ImageAware.

2. Vantagens do ImageLoader

(1) Suporte à monitoração do progresso do download

(2) Pausa no carregamento de imagens durante a rolagem da View
Através da interface PauseOnScrollListener, é possível pausar o carregamento de imagens durante a rolagem da View.

(3) Implementação padrão de vários algoritmos de cache de memória Esses caches de imagens podem ser configurados com algoritmos de cache, no entanto, o ImageLoader implementa vários algoritmos de cache por padrão, como o maior tamanho primeiro removido, o mais usado primeiro removido, o mais recente menos usado, o mais antigo primeiro removido, o mais longo tempo primeiro removido, etc.

(4) Suporte à definição de regras de nome do arquivo de cache local

Cinco, design e vantagens do Picasso

1. Design geral e fluxo

Acima está o diagrama de design geral do Picasso. A biblioteca é dividida em módulos como Dispatcher, RequestHandler e Downloader, PicassoDrawable, etc.

O Dispatcher é responsável por distribuir e processar ações, incluindo submissão, pausa, continuação, cancelamento, mudança de estado da rede, tentativa novamente, etc.

Em termos simples, o Picasso recebe a tarefa de carregamento e exibição de imagens, cria uma solicitação e a entrega ao Dispatcher, o Dispatcher distribui a tarefa para o RequestHandler específico, a tarefa obtém a imagem através da MemoryCache e do Handler (interface de dados), após a obtenção bem-sucedida da imagem, é exibida no Target através do PicassoDrawable.

É necessário prestar atenção à parte do File system do Data acima, o Picasso não possui interface de cache local personalizada, usa o cache local padrão de http, API 9 Acima, usa-se okhttp, abaixo usa-se Urlconnection, portanto, se precisar de cache local personalizada, é necessário redefinir o Downloader.

2. Vantagens do Picasso

(1) Função de estatísticas e monitoramento integrada
Suporte ao monitoramento do uso da cache de imagens, incluindo a taxa de acerto da cache, o tamanho da memória usada, o tráfego economizado, etc.

(2) Suporta processamento de prioridade
Antes de cada agendamento de tarefa, é selecionada a tarefa de prioridade alta, por exemplo, quando a prioridade do Banner na página do App é maior do que a do ícone, é muito aplicável.

(3) Suporte ao carregamento atrasado até que o tamanho da imagem seja calculado

(4) Suporte ao modo de voo, o número de threads concorrentes varia conforme o tipo de rede
ao mudar o telefone para o modo avião ou a transformação do tipo de rede, ajusta automaticamente o número máximo de concorrências da pool de threads, por exemplo, o wifi tem o número máximo de concorrências} 4, 4g é 3,3g é 2.
Aqui, o Picasso decide o número máximo de concorrências com base no tipo de rede, não no número de núcleos do CPU. 

(5) Sem cache local
Sem cache local, não significa que não há cache local, mas o Picasso não o implementa, delegando ao outro repositório de rede da Square, okhttp, para implementar. Isso tem a vantagem de poder usar o Cache no cabeçalho da resposta da solicitação.-Controlar e Expirar controlam o tempo de expiração das imagens.

Seis, design e vantagens do Glide

1. Design geral e fluxo

A seguir está o diagrama de design geral do Glide. A biblioteca é dividida em módulos como RequestManager (gerenciador de solicitações), Engine (motor de obtenção de dados), Fetcher (obtenedor de dados), MemoryCache (cache de memória), DiskLRUCache, Transformation (processamento de imagens), Encoder (armazenamento local de cache), Registry (configuração de tipos de imagens e解析adores), Target (alvo).

Em termos simples, o Glide recebe a tarefa de carregar e exibir recursos, cria um Request e o entrega ao RequestManager, o Request inicia o Engine para obter recursos da fonte de dados (através de Fetcher), após obter, a Transformation o entrega ao Target.

O Glide depende de bibliotecas open-source como DiskLRUCache, GifDecoder para completar o cache local e a decodificação de imagens Gif.

2. Vantagens do Glide

(1) Cache de imagens-> Cache de mídia
O Glide não é apenas um cache de imagens, ele suporta Gif, WebP, miniaturas. Até mesmo Vídeo, então deve ser considerado um cache de mídia. 

(2) Suporta processamento de prioridade

(3) Com Activity/A vida útil do Fragment é consistente e suporta trimMemory
O Glide mantém um RequestManager para cada context, mantendo a conexão com Activity através de FragmentTransaction/A vida útil do Fragment é consistente e há uma implementação de trimMemory correspondente disponível para chamada.

(4) Suporta okhttp, Volley
O Glide padrão obtém dados através de UrlConnection, pode ser usado em conjunto com okhttp ou Volley. Na prática, ImageLoader e Picasso também suportam okhttp e Volley.

(5) Amigável com a memória
① O cache da memória do Glide tem um design ativo
Ao recuperar dados do cache da memória, não usa get como a implementação geral, mas remove, e coloca esses dados de cache em um map de ativos com referência de suporte como valor, contando o número de referências, e julgando após a conclusão da carga da imagem, se o número de referências for vazio, reciclar.

② Imagens de cache da memória menores
O Glide usa url, view_width, view_height, resolução da tela como chave combinada, armazenando a imagem processada no cache da memória, em vez de usar a imagem original para economizar espaço

③ Com Activity/A vida útil do Fragment é consistente e suporta trimMemory

④ A imagem padrão usa RGB_ padrão565 em vez de ARGB_888
Embora a clareza seja menor, as imagens são menores e podem ser configuradas para ARGB_888.

Outros: O Glide pode suportar a expiração da URL através de signature ou sem uso de cache local

7. Resumo


Em termos gerais, a funcionalidade e a compreensão do ImageLoader são geralmente consideradas médias. 

O código do Picasso está em um único pacote, sem uma divisão rigorosa de pacotes, mas é simples, lógico e pode ser compreendido profundamente em uma ou duas horas.

O Glide é poderoso, mas o código é volumoso e a lógica é complexa. Recomenda-se usar apenas após uma compreensão mais profunda, para evitar dificuldades na solução de problemas.

Isso é tudo o que há no artigo, espero que ajude na sua aprendizagem e que você apoie o tutorial Yell.

Declaração: O conteúdo deste artigo é extraído da internet, pertence ao respectivo proprietário, fornecido pelos usuários da internet, auto-publicado, o site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidades legais relacionadas. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar, e forneça provas relevantes. Apenas após a verificação, o site deletará o conteúdo suspeito de violação de direitos autorais.)

Você também pode gostar