Używam Picassa do wyświetlania obrazu w mojej aplikacji na Androida:
/**
* 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);
}
Mam włączone debugowanie i zawsze pokazuje albo czerwony i zielony, ale nigdy nie pokazuje żółtego
Jeśli następnym razem załaduję ten sam obraz, a internet nie jest dostępny, obraz nie zostanie załadowany.
Pytania:
- Czy nie ma lokalnej pamięci podręcznej na dysku?
- Jak włączyć buforowanie dysku, ponieważ będę wielokrotnie używać tego samego obrazu.
- Czy muszę dodać uprawnienia do dysku do pliku manifestu systemu Android?
Odpowiedzi:
To właśnie zrobiłem. Działa dobrze.
Najpierw dodaj OkHttp do pliku kompilacji Gradle modułu aplikacji:
Następnie dodaj rozszerzenie klasy
Application
dodaj go do pliku manifestu w następujący sposób:
Teraz użyj Picassa tak, jak zwykle. Bez zmian.
EDYTOWAĆ:
jeśli chcesz używać tylko obrazów z pamięci podręcznej. Zadzwoń do biblioteki w ten sposób. Zauważyłem, że jeśli nie dodamy NetworkPolicy, obrazy nie będą wyświetlane w trybie całkowicie offline, nawet jeśli są buforowane . Poniższy kod rozwiązuje problem.
EDYCJA # 2
Problem z powyższym kodem polega na tym, że jeśli wyczyścisz pamięć podręczną, Picasso będzie nadal szukał go w trybie offline w pamięci podręcznej i zawiedzie, poniższy przykład kodu patrzy na lokalną pamięć podręczną, jeśli nie zostanie znaleziony w trybie offline, przechodzi w tryb online i uzupełnia pamięć podręczną.
źródło
okhttp3.OkHttpClient
biblioteką musisz skorzystać zOkHttp3Downloader
formularza zajęćcompile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
1) odpowiedź na pierwsze pytanie: zgodnie z metodą Picassa Doc for With ()
Ale
Disk Cache
operacja dla globalnego Default Picasso jest dostępna tylko w API 14+2) odpowiedź na drugie pytanie:
Picasso
użyjHTTP
żądania klienta doDisk Cache
działania Więc możesz stworzyć własnąhttp request header
właściwość has zaCache-Control
pomocąmax-age
I utworzyć własną statyczną instancję Picassa zamiast domyślnego Picassa.1] HttpResponseCache (uwaga: działa tylko dla API 13+)
2] OkHttpClient (działa dla wszystkich API)
Przykład użycia
OkHttpClient
do stworzenia własnej statycznej klasy Picassa:Najpierw utwórz nową klasę, aby uzyskać własny
picasso
obiekt singletonużyj własnego
picasso
obiektu singleton zamiastPicasso.With()
PicassoCache.getPicassoInstance(getContext()).load(imagePath).into(imageView)
3) odpowiedź na trzecie pytanie: nie potrzebujesz żadnych uprawnień dyskowych do operacji pamięci podręcznej dysku
Referencje : Github Emisja o cache dysku , dwa pytania zostało odebrane przez @ jake-Wharton -> question1 i question2
źródło
FATAL EXCEPTION: main java.lang.NoClassDefFoundError: com.squareup.okhttp.OkHttpClient
okhttp
Do buforowania użyłbym przechwytywaczy OkHttp, aby uzyskać kontrolę nad polityką buforowania. Zapoznaj się z tym przykładem zawartym w bibliotece OkHttp.
RewriteResponseCacheControl.java
Oto, jak bym go użył z Picassem -
źródło
W przypadku najnowszej wersji 2.71828 Oto Twoja odpowiedź.
P1 : Czy nie ma lokalnej pamięci podręcznej na dysku?
A1 : W Picassie istnieje domyślne buforowanie, a przepływ żądań jest taki sam
Gdziekolwiek napotkają pierwszy obraz, użyją go, a następnie zatrzymają przepływ żądania. A co z przepływem odpowiedzi? Nie martw się, oto jest.
Domyślnie będą najpierw zapisywać na dysku lokalnym dla rozszerzonej pamięci podręcznej. Następnie pamięć, na przykład użycie pamięci podręcznej.
Możesz użyć wbudowanego wskaźnika w Picasso, aby zobaczyć, gdzie powstają obrazy, włączając tę opcję.
Wyświetli flagę w lewym górnym rogu Twoich zdjęć.
P2 : Jak włączyć buforowanie dysku, ponieważ będę wielokrotnie używać tego samego obrazu?
A2 : Nie musisz go włączać. To jest domyślne.
Musisz wyłączyć to, jeśli chcesz, aby obrazy były zawsze świeże. Istnieje 2 sposoby wyłączenia buforowania.
.memoryPolicy()
na NO_CACHE i / lub NO_STORE a przepływ będzie wyglądał następująco.NO_CACHE pominie wyszukiwanie obrazów z pamięci.
NO_STORE pominie zapisywanie obrazów w pamięci przy pierwszym załadowaniu obrazów.
.networkPolicy()
na NO_CACHE i / lub NO_STORE, a przepływ będzie wyglądał następująco.NO_CACHE pominie wyszukiwanie obrazów z dysku.
NO_STORE pominie zapisywanie obrazów na dysku przy pierwszym załadowaniu obrazów.
Nie możesz WYŁĄCZYĆ ani dla całkowitego braku buforowania obrazów. Oto przykład.
Przepływ bez buforowania i przechowywania będzie wyglądał następująco.
Może więc być to konieczne do zminimalizowania użycia pamięci aplikacji.
P3 : Czy muszę dodać uprawnienia do dysku do pliku manifestu systemu Android?
A3 : Nie, ale nie zapomnij dodać pozwolenia INTERNETOWEGO dla twojego żądania HTTP.
źródło
1) Picasso ma domyślnie pamięć podręczną (patrz odpowiedź Ahmed Hamdy)
2) Jeśli naprawdę musisz pobrać obraz z pamięci podręcznej dysku, a następnie z sieci, polecam napisanie własnego downloadera:
A w aplikacji singleton w metodzie OnCreate użyj go z picasso:
3) Brak uprawnień wymaganych do domyślnego folderu pamięci podręcznej aplikacji
źródło
Dodaj następujący kod,
Application.onCreate
a następnie używaj go normalnieJeśli najpierw buforujesz obrazy, zrób coś takiego w
ProductImageDownloader.doBackground
i załaduj swoje obrazy jak normalnie lub z pamięcią podręczną dysku
Uwaga:
Kolor czerwony oznacza, że obraz jest pobierany z sieci .
Kolor zielony oznacza, że obraz jest pobierany z pamięci podręcznej .
Kolor niebieski oznacza, że obraz jest pobierany z pamięci dyskowej .
Przed wydaniem aplikacji usuń ją lub ustaw
false
picasso.setLoggingEnabled(true);
,picasso.setIndicatorsEnabled(true);
jeśli nie jest to wymagane. Dziękujęźródło
Nie wiem, jak dobre jest to rozwiązanie, ale zdecydowanie jest to ŁATWE, którego właśnie użyłem w mojej aplikacji i działa dobrze
ładujesz obraz w ten sposób
Możesz dostać
bimap
coś takiegoTeraz ukryj to
Bitmap
wJPG
pliku i zapisz w pamięci podręcznej, poniżej znajduje się pełny kod do pobrania bimapy i buforowania jejget()
metodaPiccasso
z jakiegoś powodu trzeba było nazywane na osobnym wątku, ja ratuję ten obraz również w tym samym wątku.Po zapisaniu obrazu możesz pobrać wszystkie takie pliki
teraz możesz znaleźć plik, którego szukasz, jak poniżej
źródło
Używam tego kodu i zadziałało, być może przydatne dla Ciebie:
źródło
Miałem ten sam problem i zamiast tego użyłem biblioteki Glide. Pamięć podręczna jest tam po wyjęciu z pudełka. https://github.com/bumptech/glide
źródło