Bagaimana saya bisa menyimpan gambar setelah diunduh dari web?
141
Dan sekarang lucunya: gunakan cache sistem.
URL url = new URL(strUrl);
URLConnection connection = url.openConnection();
connection.setUseCaches(true);
Object response = connection.getContent();
if (response instanceof Bitmap) {
Bitmap bitmap = (Bitmap)response;
}
Menyediakan memori dan cache flash-rom, dibagikan dengan browser.
Grr. Saya berharap seseorang mengatakan kepada saya bahwa sebelum saya menulis cache manager saya sendiri.
connection.getContent()
selalu mengembalikan InputStream untuk saya, apa yang saya lakukan salah?Bitmap response = BitmapFactory.decodeStream((InputStream)connection.getContent());
Mengenai
connection.setUseCaches
solusi elegan di atas: sayangnya, itu tidak akan bekerja tanpa usaha tambahan. Anda harus menginstalResponseCache
menggunakanResponseCache.setDefault
. Kalau tidak,HttpURLConnection
diam-diam akan mengabaikansetUseCaches(true)
bit.Lihat komentar di bagian atas
FileResponseCache.java
untuk detail:http://libs-for-android.googlecode.com/svn/reference/com/google/android/filecache/FileResponseCache.html
(Saya akan memposting ini dalam komentar, tetapi saya tampaknya tidak memiliki cukup karma SO.)
sumber
HttpResponseCache
, Anda mungkin menemukanHttpResponseCache.getHitCount()
0. kembali. Saya tidak yakin tapi saya pikir itu karena server web yang Anda minta tidak menggunakan header caching dalam kasus itu. Untuk membuat caching berfungsi, gunakanconnection.addRequestProperty("Cache-Control", "max-stale=" + MAX_STALE_CACHE);
..getContent()
metode karena 304 tanggapan tidak memiliki badan respons terkait dengan standar RFC.Konversikan ke dalam Bitmap dan kemudian simpan dalam Koleksi (HashMap, Daftar, dll.) Atau Anda dapat menuliskannya di SDcard.
Saat menyimpannya di ruang aplikasi menggunakan pendekatan pertama, Anda mungkin ingin membungkusnya di sekitar java.lang.ref.SoftReference khusus jika jumlahnya besar (sehingga mereka dikumpulkan saat krisis). Ini bisa terjadi Reload sekalipun.
menulisnya di SDcard tidak akan membutuhkan Reload; hanya izin pengguna.
sumber
Uri
referensi path yang bisa Anda sampaikanImageView
dan tampilan kustom lainnya. Karena setiap kali Andacompress
, Anda akan kehilangan kualitas. Tentu saja ini berlaku untuk algoritma lossy saja. Metode ini juga akan memungkinkan Anda untuk bahkan menyimpan hash file dan menggunakannya saat Anda meminta file dari server melaluiIf-None-Match
danETag
header.Gunakan
LruCache
untuk menyimpan gambar dengan efisien. Anda dapat membaca tentangLruCache
dari situs Pengembang AndroidSaya telah menggunakan solusi di bawah ini untuk unduhan dan caching gambar di Android. Anda dapat mengikuti langkah-langkah di bawah ini:
LANGKAH 1: buat Kelas Bernama
ImagesCache
. Saya sudah menggunakanSingleton object for this class
LANGKAH 2:
buat kelas lain bernama DownloadImageTask yang digunakan jika bitmap tidak tersedia di cache, ia akan mengunduhnya dari sini:
LANGKAH 3: Penggunaan dari Anda
Activity
atauAdapter
Catatan: Jika Anda ingin memuat gambar dari url dari
Activity
Kelas. Gunakan Konstruktor keduaDownloadImageTask
, tetapi jika Anda ingin menampilkan gambar dariAdapter
gunakan Konstruktor pertamaDownloadImageTask
(misalnya Anda memiliki gambarListView
dan Anda mengatur gambar dari 'Adaptor')PENGGUNAAN DARI AKTIVITAS:
PENGGUNAAN DARI ADAPTER:
catatan:
cache.initializeCache()
Anda dapat menggunakan pernyataan ini di Aktivitas pertama aplikasi Anda. Setelah Anda menginisialisasi cache, Anda tidak perlu menginisialisasi setiap kali jika Anda menggunakanImagesCache
instance.Saya tidak pernah pandai menjelaskan hal-hal tetapi saya harap ini akan membantu para pemula bahwa cara menggunakan cache
LruCache
dan penggunaannya :)EDIT:
Sekarang, ada beberapa perpustakaan terkenal yang dikenal
Picasso
danGlide
dapat digunakan untuk memuat gambar dengan sangat efisien di aplikasi android. Coba pustaka Picasso yang sangat sederhana dan bermanfaat ini untuk Android dan Glide For Android . Anda tidak perlu khawatir tentang gambar cache.Anda juga dapat mengunjungi blog untuk perbedaan antara Glide dan Picasso
sumber
if(cache == null)
yang memecahkan masalah saya! :)Untuk mengunduh gambar dan menyimpannya ke kartu memori, Anda dapat melakukannya seperti ini.
Jangan lupa untuk menambahkan izin Internet ke manifes Anda:
sumber
Saya akan mempertimbangkan untuk menggunakan cache gambar droidfu. Ini mengimplementasikan cache gambar berbasis di memori dan berbasis disk. Anda juga mendapatkan WebImageView yang memanfaatkan perpustakaan ImageCache.
Berikut adalah deskripsi lengkap droidfu dan WebImageView: http://brainflush.wordpress.com/2009/11/23/droid-fu-part-2-webimageview-and-webgalleryadapter/
sumber
Saya sudah mencoba SoftReferences, mereka terlalu agresif direklamasi di android sehingga saya merasa tidak ada gunanya menggunakannya
sumber
SoftReference
s. Mereka merekomendasikan menggunakan merekaLruCache
sebagai gantinya.Seperti yang disarankan Thunder Rabbit, ImageDownloader adalah yang terbaik untuk pekerjaan itu. Saya juga menemukan sedikit variasi kelas di:
http://theandroidcoder.com/utilities/android-image-download-and-caching/
Perbedaan utama antara keduanya adalah bahwa ImageDownloader menggunakan sistem caching Android, dan yang dimodifikasi menggunakan penyimpanan internal dan eksternal sebagai caching, menjaga gambar dalam cache tanpa batas waktu atau sampai pengguna menghapusnya secara manual. Penulis juga menyebutkan kompatibilitas Android 2.1.
sumber
Ini tangkapan yang bagus oleh Joe. Contoh kode di atas memiliki dua masalah - satu - objek respons bukan merupakan contoh Bitmap (ketika URL saya mereferensikan jpg, seperti http: \ website.com \ image.jpg, ini merupakan
org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl $ LimitedInputStream).
Kedua, seperti yang ditunjukkan oleh Joe, tidak ada cache yang terjadi tanpa cache respons dikonfigurasikan. Pengembang Android dibiarkan menggulung cache mereka sendiri. Berikut ini contoh untuk melakukannya, tetapi itu hanya cache dalam memori, yang sebenarnya bukan solusi lengkap.
http://codebycoffee.com/2010/06/29/using-responsecache-in-an-android-app/
API caching URLConnection dijelaskan di sini:
http://download.oracle.com/javase/6/docs/technotes/guides/net/http-cache.html
Saya masih berpikir ini adalah solusi OK untuk menempuh rute ini - tetapi Anda masih harus menulis cache. Kedengarannya menyenangkan, tapi saya lebih suka menulis fitur.
sumber
Ada entri khusus di bagian pelatihan resmi Android tentang ini: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
Bagian ini cukup baru, tidak ada di sana ketika pertanyaan diajukan.
Solusi yang disarankan adalah menggunakan LruCache. Kelas itu diperkenalkan di Honeycomb, tetapi juga termasuk di perpustakaan kompatibilitas.
Anda dapat menginisialisasi LruCache dengan mengatur jumlah atau entri maksimum dan secara otomatis Anda akan mengurutkannya dan membersihkannya dari yang kurang digunakan saat Anda melampaui batas. Selain itu digunakan sebagai Peta normal.
Kode sampel dari halaman resmi:
SoftReferences sebelumnya adalah alternatif yang baik, tetapi tidak lagi, mengutip dari halaman resmi:
sumber
Pertimbangkan untuk menggunakan pustaka Universal Image Loader oleh Sergey Tarasevich . Itu datang dengan:
Universal Image Loader memungkinkan manajemen cache terperinci untuk gambar yang diunduh, dengan konfigurasi cache berikut:
UsingFreqLimitedMemoryCache
: Bitmap yang paling jarang digunakan dihapus ketika batas ukuran cache terlampaui.LRULimitedMemoryCache
: Bitmap yang paling baru digunakan dihapus ketika batas ukuran cache terlampaui.FIFOLimitedMemoryCache
: Aturan FIFO digunakan untuk penghapusan ketika batas ukuran cache terlampaui.LargestLimitedMemoryCache
: Bitmap terbesar dihapus ketika batas ukuran cache terlampaui.LimitedAgeMemoryCache
: Objek dalam cache dihapus ketika usianya melebihi nilai yang ditentukan .WeakMemoryCache
: Cache memori dengan hanya referensi lemah ke bitmap.Contoh penggunaan sederhana:
Contoh ini menggunakan default
UsingFreqLimitedMemoryCache
.sumber
Apa yang sebenarnya berhasil bagi saya adalah mengatur ResponseCache di kelas Utama saya:
dan
saat mengunduh bitmap.
http://practicaldroid.blogspot.com/2013/01/utilizing-http-response-cache.html
sumber
Google libs-for-android memiliki perpustakaan yang bagus untuk mengelola cache gambar dan file.
http://code.google.com/p/libs-for-android/
sumber
Saya telah bergulat dengan ini selama beberapa waktu; jawaban yang menggunakan SoftReferences akan kehilangan data terlalu cepat. Jawaban yang menyarankan instantiating RequestCache terlalu berantakan, ditambah saya tidak pernah bisa menemukan contoh lengkap.
Tetapi ImageDownloader.java bekerja sangat baik untuk saya. Ia menggunakan HashMap sampai kapasitas tercapai atau sampai waktu pembersihan habis, maka semuanya dipindahkan ke SoftReference, dengan demikian menggunakan yang terbaik dari kedua dunia.
sumber
Saya menyarankan IGNITION ini bahkan lebih baik daripada Droid fu
https://github.com/kaeppler/ignition
https://github.com/kaeppler/ignition/wiki/Sample-applications
sumber
Bahkan kemudian menjawab, tetapi saya menulis Android Image Manager yang menangani caching secara transparan (memori dan disk). Kode ini ada di Github https://github.com/felipecsl/Android-ImageManager
sumber
Akhir jawaban, tapi kupikir aku harus menambahkan link ke situs saya karena saya telah menulis tutorial bagaimana membuat cache gambar untuk android:
http://squarewolf.nl/2010/11/android-image-cache/Update: yang halaman telah diambil offline karena sumbernya sudah usang. Saya bergabung dengan @elenasys dalam sarannya untuk menggunakan Ignition .Jadi untuk semua orang yang menemukan pertanyaan ini dan belum menemukan solusi: semoga Anda menikmati! = D
sumber
Jawaban telat tapi saya pikir perpustakaan ini akan banyak membantu dengan caching gambar: https://github.com/crypticminds/ColdStorage .
Cukup beri catatan pada ImageView dengan @LoadCache (R.id.id_of_my_image_view, "URL_to_downlaod_image_from) dan itu akan menangani pengunduhan gambar dan memuatnya ke dalam tampilan gambar. Anda juga dapat menentukan gambar placeholder dan memuat animasi.
Dokumentasi rinci anotasi ada di sini: - https://github.com/crypticminds/ColdStorage/wiki/@LoadImage-annotation
sumber