Saya menggunakan Picasso untuk menampilkan gambar di aplikasi android saya:
/**
* 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);
}
Saya telah mengaktifkan debugging dan selalu menunjukkan warna merah dan hijau, tetapi tidak pernah menunjukkan warna kuning
Sekarang jika saya memuat gambar yang sama lain kali dan internet tidak tersedia, gambar tersebut tidak dimuat.
Pertanyaan:
- Apakah itu tidak memiliki cache disk lokal?
- Bagaimana cara mengaktifkan cache disk karena saya akan menggunakan gambar yang sama beberapa kali.
- Apakah saya perlu menambahkan beberapa izin disk ke file manifes Android?
Jawaban:
Inilah yang saya lakukan. Bekerja dengan baik.
Pertama tambahkan OkHttp ke file build gradle dari modul aplikasi:
Kemudian buat kelas diperpanjang
Application
tambahkan ke file Manifest sebagai berikut:
Sekarang gunakan Picasso seperti biasa. Tidak ada perubahan.
EDIT:
jika Anda hanya ingin menggunakan gambar yang disimpan dalam cache. Panggil perpustakaan seperti ini. Saya perhatikan bahwa jika kita tidak menambahkan networkPolicy, gambar tidak akan muncul dalam permulaan offline sepenuhnya meskipun mereka di-cache . Kode di bawah menyelesaikan masalah.
EDIT # 2
Masalah dengan kode di atas adalah jika Anda mengosongkan cache, Picasso akan terus mencarinya secara offline di cache dan gagal, contoh kode berikut melihat cache lokal, jika tidak ditemukan offline, akan online dan mengisi cache.
sumber
okhttp3.OkHttpClient
perpustakaan Anda harus menggunakanOkHttp3Downloader
formulir kelascompile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
1) jawaban dari pertanyaan pertama: menurut metode Picasso Doc for With ()
Tetapi
Disk Cache
operasi untuk Picasso Default global hanya tersedia di API 14+2) jawaban dari pertanyaan kedua:
Picasso
gunakanHTTP
permintaan klien untukDisk Cache
operasi Jadi Anda dapat membuat milik Anda sendirihttp request header
memiliki propertiCache-Control
denganmax-age
Dan membuat Instance Picasso Statis Anda sendiri daripada Picasso default Dengan menggunakan1] HttpResponseCache (Catatan: Hanya berfungsi untuk API 13+)
2] OkHttpClient (Bekerja untuk semua API)
Contoh penggunaan
OkHttpClient
untuk membuat kelas Picasso Statis Anda sendiri:Pertama buat kelas baru untuk mendapatkan
picasso
objek tunggal Anda sendirigunakan
picasso
objek tunggal Anda sendiri, bukanPicasso.With()
PicassoCache.getPicassoInstance(getContext()).load(imagePath).into(imageView)
3) jawaban untuk pertanyaan ketiga: Anda tidak memerlukan izin disk untuk operasi Cache disk
Referensi : Masalah Github tentang cache disk , dua Pertanyaan telah dijawab oleh @ jake-wharton -> Pertanyaan1 dan Pertanyaan2
sumber
FATAL EXCEPTION: main java.lang.NoClassDefFoundError: com.squareup.okhttp.OkHttpClient
okhttp
Untuk caching, saya akan menggunakan interseptor OkHttp untuk mendapatkan kendali atas kebijakan caching. Lihat contoh ini yang disertakan dalam pustaka OkHttp.
RewriteResponseCacheControl.java
Inilah cara saya menggunakannya dengan Picasso -
sumber
Untuk versi terbaru 2.71828 Ini adalah jawaban Anda.
T1 : Apakah itu tidak memiliki cache disk lokal?
A1 : Ada cache default dalam Picasso dan aliran permintaan seperti ini
Di mana pun mereka bertemu gambar pertama kali, mereka akan menggunakan gambar itu dan kemudian menghentikan aliran permintaan. Bagaimana dengan aliran respons? Jangan khawatir, ini dia.
Secara default, mereka akan menyimpan ke disk lokal terlebih dahulu untuk cache penyimpanan yang diperpanjang. Kemudian memori, untuk contoh penggunaan cache.
Anda dapat menggunakan indikator built-in di Picasso untuk melihat di mana gambar terbentuk dengan mengaktifkannya.
Ini akan menunjukkan bendera di sudut kiri atas gambar Anda.
T2 : Bagaimana cara mengaktifkan cache disk karena saya akan menggunakan gambar yang sama beberapa kali?
A2 : Anda tidak harus mengaktifkannya. Ini defaultnya.
Yang perlu Anda lakukan adalah NONAKTIFKAN jika Anda ingin gambar Anda selalu segar. Ada 2 cara untuk menonaktifkan caching.
.memoryPolicy()
ke NO_CACHE dan / atau NO_STORE dan alurnya akan terlihat seperti ini.NO_CACHE akan melewatkan mencari gambar dari memori.
NO_STORE akan melewatkan menyimpan gambar dalam memori saat memuat gambar pertama.
.networkPolicy()
ke NO_CACHE dan / atau NO_STORE dan alurnya akan terlihat seperti ini.NO_CACHE akan melewatkan mencari gambar dari disk.
NO_STORE akan melewatkan gambar penyimpanan di disk saat memuat gambar pertama.
Anda tidak dapat MENONAKTIFKAN keduanya karena tidak ada gambar yang disimpan dalam cache. Berikut ini contohnya.
Aliran tanpa cache dan penyimpanan sepenuhnya akan terlihat seperti ini.
Jadi, Anda mungkin memerlukan ini untuk meminimalkan penggunaan penyimpanan aplikasi Anda juga.
T3 : Apakah saya perlu menambahkan beberapa izin disk ke file manifes android?
A3 : Tidak, tapi jangan lupa untuk menambahkan izin INTERNET untuk permintaan HTTP Anda.
sumber
1) Picasso secara default memiliki cache (lihat jawaban hamdy ahmed)
2) Jika Anda benar-benar harus mengambil gambar dari cache disk dan kemudian jaringan, saya sarankan untuk menulis pengunduh Anda sendiri:
Dan di Application singleton dalam metode OnCreate menggunakannya dengan picasso:
3) Tidak diperlukan izin untuk menghapus folder cache aplikasi
sumber
Tambahkan kode followning
Application.onCreate
lalu gunakan secara normalJika Anda menyimpan gambar terlebih dahulu, lakukan sesuatu seperti ini di
ProductImageDownloader.doBackground
dan memuat gambar Anda seperti biasa atau dengan cache disk
catatan:
Warna merah menunjukkan bahwa gambar diambil dari jaringan .
Warna hijau menunjukkan bahwa gambar diambil dari memori cache .
Warna biru menunjukkan bahwa gambar diambil dari memori disk .
Sebelum merilis aplikasi, hapus atau setel
false
picasso.setLoggingEnabled(true);
,picasso.setIndicatorsEnabled(true);
jika tidak diperlukan. Terima kasihsumber
Saya tidak tahu seberapa bagus solusi itu tetapi yang pasti yang MUDAH saya gunakan di aplikasi saya dan berfungsi dengan baik
Anda memuat gambar seperti itu
Anda bisa mendapatkan yang
bimap
seperti ituSekarang sembunyikan itu
Bitmap
menjadiJPG
file dan simpan di dalam cache, di bawah ini adalah kode lengkap untuk mendapatkan bimap dan menyimpannya di cacheyang
get()
metodePiccasso
untuk beberapa alasan yang diperlukan untuk disebut di thread terpisah, saya menyimpan gambar yang juga pada thread yang sama.Setelah gambar disimpan, Anda bisa mendapatkan semua file seperti itu
Sekarang Anda dapat menemukan file yang Anda cari seperti di bawah ini
sumber
Saya menggunakan kode ini dan berhasil, mungkin berguna untuk Anda:
sumber
Saya memiliki masalah yang sama dan menggunakan perpustakaan Glide sebagai gantinya. Cache di luar kotak di sana. https://github.com/bumptech/glide
sumber