Estou usando o Picasso para exibir imagens em meu aplicativo Android:
/**
* load image.This is within a activity so this context is activity
*/
public void loadImage (){
Picasso picasso = Picasso.with(this);
picasso.setDebugging(true);
picasso.load(quiz.getImageUrl()).into(quizImage);
}
Eu habilitei a depuração e sempre mostra vermelho e verde. Mas nunca mostra amarelo
Agora, se eu carregar a mesma imagem da próxima vez e a internet não estiver disponível, a imagem não será carregada.
Questões:
- Não tem cache de disco local?
- Como faço para habilitar o cache de disco, pois estarei usando a mesma imagem várias vezes.
- Preciso adicionar alguma permissão de disco ao arquivo de manifesto do Android?
Respostas:
Isso é o que eu fiz. Funciona bem.
Primeiro, adicione OkHttp ao arquivo de compilação do gradle do módulo do app:
Em seguida, faça uma extensão de classe
Application
adicione-o ao arquivo Manifest da seguinte maneira:
Agora use o Picasso como faria normalmente. Sem alterações.
EDITAR:
se você quiser usar apenas imagens em cache. Ligue para a biblioteca assim. Percebi que, se não adicionarmos a networkPolicy, as imagens não serão exibidas em um início totalmente offline, mesmo se estiverem em cache . O código abaixo resolve o problema.
EDITAR # 2
o problema com o código acima é que, se você limpar o cache, o Picasso continuará procurando off-line no cache e falhará, o exemplo de código a seguir examina o cache local; se não for encontrado off-line, ele fica online e reabastece o cache.
fonte
okhttp3.OkHttpClient
biblioteca, você tem que usar oOkHttp3Downloader
formulário de classecompile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
1) resposta da primeira pergunta: de acordo com o método Picasso Doc para With ()
Mas a
Disk Cache
operação para Picasso padrão global está disponível apenas na API 14+2) resposta da segunda pergunta:
Picasso
use aHTTP
solicitação do cliente para aDisk Cache
operação Assim, você pode fazer sua própriahttp request header
propriedadeCache-Control
commax-age
E criar sua própria instância estática de Picasso em vez do Picasso padrão.1] HttpResponseCache (Nota: Funciona apenas para API 13+)
2] OkHttpClient (Funciona para todas as APIs)
Exemplo de uso
OkHttpClient
para criar sua própria classe Static Picasso:Primeiro crie uma nova classe para obter seu próprio
picasso
objeto singletonuse seu próprio
picasso
objeto singleton em vez dePicasso.With()
PicassoCache.getPicassoInstance(getContext()).load(imagePath).into(imageView)
3) resposta para a terceira pergunta: você não precisa de nenhuma permissão de disco para operações de cache de disco
Referências : Problema do Github sobre cache de disco , duas perguntas foram respondidas por @ jake-wharton -> Pergunta1 e Pergunta2
fonte
FATAL EXCEPTION: main java.lang.NoClassDefFoundError: com.squareup.okhttp.OkHttpClient
okhttp
Para armazenamento em cache, eu usaria interceptores OkHttp para obter controle sobre a política de armazenamento em cache. Confira este exemplo que está incluído na biblioteca OkHttp.
RewriteResponseCacheControl.java
É assim que eu o usaria com o Picasso -
fonte
Para a versão mais atualizada 2.71828 Esta é a sua resposta.
T1 : ele não tem cache de disco local?
A1 : Há cache padrão no Picasso e o fluxo de solicitação exatamente como este
Sempre que encontrarem sua imagem primeiro, eles a usarão e, em seguida, interromperão o fluxo de solicitação. E quanto ao fluxo de resposta? Não se preocupe, aqui está.
Por padrão, eles serão armazenados em um disco local primeiro para o cache de armazenamento estendido. Em seguida, a memória, para o uso de instância do cache.
Você pode usar o indicador embutido no Picasso para ver onde as imagens se formam, ativando isso.
Ele vai mostrar uma bandeira no canto superior esquerdo de suas fotos.
P2 : Como habilito o cache de disco, pois usarei a mesma imagem várias vezes?
A2 : Você não precisa habilitá-lo. É o padrão.
O que você precisa fazer é DESATIVÁ - LO quando quiser que suas imagens estejam sempre frescas. Há duas formas de cache desabilitado.
.memoryPolicy()
como NO_CACHE e / ou NO_STORE e o fluxo ficará assim.NO_CACHE irá pular a procura de imagens da memória.
NO_STORE irá pular imagens de armazenamento na memória quando as imagens forem carregadas pela primeira vez.
.networkPolicy()
como NO_CACHE e / ou NO_STORE e o fluxo ficará assim.NO_CACHE irá pular a procura de imagens do disco.
NO_STORE irá pular imagens de armazenamento no disco quando as imagens forem carregadas pela primeira vez.
Você não pode DESATIVAR para não armazenar imagens em cache. Aqui está um exemplo.
O fluxo sem cache e sem armazenamento será assim.
Portanto, você pode precisar disso para minimizar o uso de armazenamento do aplicativo também.
P3 : Preciso adicionar alguma permissão de disco ao arquivo de manifesto do Android?
A3 : Não, mas não se esqueça de adicionar a permissão INTERNET para sua solicitação HTTP.
fonte
1) Por padrão, o Picasso tem cache (veja a resposta de ahmed hamdy)
2) Se você realmente precisa tirar uma imagem do cache de disco e então da rede, recomendo escrever seu próprio downloader:
E no singleton do aplicativo no método OnCreate, use-o com o picasso:
3) Nenhuma permissão necessária para cancelar a pasta de cache do aplicativo
fonte
Adicione o código a
Application.onCreate
seguir e use-o normalmenteSe você armazenar imagens em cache primeiro, faça algo assim em
ProductImageDownloader.doBackground
e carregue suas imagens normalmente ou com cache de disco
Nota:
A cor vermelha indica que a imagem foi obtida da rede .
A cor verde indica que a imagem foi obtida da memória cache .
A cor azul indica que a imagem foi obtida da memória do disco .
Antes de liberar o aplicativo, exclua ou configure-o
false
picasso.setLoggingEnabled(true);
,picasso.setIndicatorsEnabled(true);
se não for necessário. Obrigadofonte
Não sei se essa solução é boa, mas é definitivamente A FÁCIL que acabei de usar no meu aplicativo e está funcionando bem
você carrega a imagem assim
Você pode conseguir
bimap
coisas assimAgora converta isso
Bitmap
em umJPG
arquivo e armazene no cache, abaixo está o código completo para obter o bimapa e armazená-lo em cacheo
get()
método de,Piccasso
por algum motivo, precisava ser chamado em um tópico separado, estou salvando essa imagem também nesse mesmo tópico.Assim que a imagem for salva, você pode obter todos os arquivos assim
agora você pode encontrar o arquivo que está procurando como abaixo
fonte
Eu uso este código e funcionou, talvez útil para você:
fonte
Eu tive o mesmo problema e usei a biblioteca Glide. O cache está fora da caixa. https://github.com/bumptech/glide
fonte