Saya menggunakan a ListView
untuk menampilkan beberapa gambar dan keterangan yang terkait dengan gambar-gambar itu. Saya mendapatkan gambar dari Internet. Apakah ada cara untuk malas memuat gambar sehingga saat teks ditampilkan, UI tidak diblokir dan gambar ditampilkan saat diunduh?
Jumlah gambar tidak diperbaiki.
setUrl
.Jawaban:
Inilah yang saya buat untuk menahan gambar yang sedang ditampilkan aplikasi saya. Harap dicatat bahwa objek "Log" yang digunakan di sini adalah pembungkus khusus saya di sekitar kelas Log terakhir di dalam Android.
sumber
LRU Cache
developer.android.com/training/displaying-bitmaps/…Saya membuat demo sederhana daftar malas (terletak di GitHub) dengan gambar.
Mungkin bermanfaat bagi seseorang. Ini mengunduh gambar di utas latar belakang. Gambar sedang di-cache pada kartu SD dan di memori. Implementasi cache sangat sederhana dan hanya cukup untuk demo. Saya memecahkan kode gambar dengan inSampleSize untuk mengurangi konsumsi memori. Saya juga mencoba menangani tampilan daur ulang dengan benar.
sumber
Saya merekomendasikan instrumen open source Universal Image Loader . Ini awalnya didasarkan pada proyek Fedor Vlasov LazyList dan telah jauh lebih baik sejak saat itu.
sumber
Multithreading For Performance , tutorial oleh Gilles Debunne.
Ini dari Blog Pengembang Android. Kode yang disarankan menggunakan:
AsyncTasks
.FIFO cache
,.garbage collect
Cache yang lembut dan mudah diunduh.Drawable
saat Anda mengunduh.sumber
Pembaruan: Perhatikan bahwa jawaban ini sangat tidak efektif sekarang. Pengumpul Sampah bertindak agresif pada SoftReference dan WeakReference, jadi kode ini TIDAK cocok untuk aplikasi baru. (Alih-alih, coba pustaka seperti Universal Image Loader yang disarankan dalam jawaban lain.)
Terima kasih kepada James untuk kodenya, dan Bao-Long untuk saran penggunaan SoftReference. Saya menerapkan perubahan SoftReference pada kode James. Sayangnya SoftReferences menyebabkan gambar saya dikumpulkan terlalu cepat. Dalam kasus saya, itu baik-baik saja tanpa SoftReference, karena ukuran daftar saya terbatas dan gambar saya kecil.
Ada diskusi dari tahun lalu mengenai SoftReferences di grup google: tautan ke utas . Sebagai solusi untuk pengumpulan sampah yang terlalu dini, mereka menyarankan kemungkinan pengaturan ukuran tumpukan VM secara manual menggunakan dalvik.system.VMRuntime.setMinimumHeapSize (), yang tidak terlalu menarik bagi saya.
sumber
Picasso
Gunakan Perpustakaan Picasso Jake Wharton. (Pustaka ImageLoading Sempurna dari pengembang ActionBarSherlock)
Pengunduhan dan caching library gambar yang tangguh untuk Android.
Gambar menambahkan konteks dan bakat visual yang sangat dibutuhkan untuk aplikasi Android. Picasso memungkinkan pemuatan gambar tanpa repot di aplikasi Anda — sering kali dalam satu baris kode!
Banyak perangkap umum pemuatan gambar di Android ditangani secara otomatis oleh Picasso:
Menangani daur ulang ImageView dan unduh pembatalan dalam adaptor. Transformasi gambar yang kompleks dengan penggunaan memori minimal. Memori dan cache disk otomatis.
Perpustakaan Picasso Jake Wharton
Meluncur
Glide adalah kerangka kerja manajemen media open source yang cepat dan efisien untuk Android yang membungkus decoding media, memori dan caching disk, dan pengumpulan sumber daya ke dalam antarmuka yang sederhana dan mudah digunakan.
Glide mendukung pengambilan, dekode, dan penayangan gambar video, gambar, dan GIF animasi. Glide termasuk api fleksibel yang memungkinkan pengembang untuk terhubung ke hampir semua tumpukan jaringan. Secara default Glide menggunakan stack berbasis HttpUrlConnection khusus, tetapi juga menyertakan pustaka utilitas yang dihubungkan dengan proyek Volley Google atau pustaka OkHttp Square.
Fokus utama Glide adalah membuat pengguliran daftar gambar semulus dan secepat mungkin, tetapi Glide juga efektif untuk hampir semua kasus di mana Anda perlu mengambil, mengubah ukuran, dan menampilkan gambar jarak jauh.
Pustaka Pemuatan Gambar Glide
Fresco oleh Facebook
Fresco adalah sistem yang kuat untuk menampilkan gambar dalam aplikasi Android.
Fresco menangani pemuatan dan tampilan gambar, jadi Anda tidak harus melakukannya. Ini akan memuat gambar dari jaringan, penyimpanan lokal, atau sumber daya lokal, dan menampilkan pengganti sampai gambar telah tiba. Ini memiliki dua tingkat cache; satu di memori dan satu lagi di penyimpanan internal.
Fresco Github
Di Android 4.x dan lebih rendah, Fresco menempatkan gambar di wilayah khusus memori Android. Ini memungkinkan aplikasi Anda berjalan lebih cepat - dan lebih jarang mengalami OutOfMemoryError yang ditakuti.
Dokumentasi Fresco
sumber
Loader berkinerja tinggi - setelah memeriksa metode yang disarankan di sini, saya menggunakan solusi Ben dengan beberapa perubahan -
Saya menyadari bahwa bekerja dengan drawables lebih cepat daripada dengan bitmap jadi saya menggunakan drawables
Menggunakan SoftReference bagus, tetapi itu membuat gambar yang di-cache terlalu sering dihapus, jadi saya menambahkan daftar Linked yang menyimpan referensi gambar, mencegah dari gambar yang akan dihapus, hingga mencapai ukuran yang telah ditentukan.
Untuk membuka InputStream saya menggunakan java.net.URLConnection yang memungkinkan saya untuk menggunakan cache web (Anda perlu mengatur cache respons terlebih dahulu, tapi itu cerita lain)
Kode saya:
sumber
import java.util.Map; import java.util.HashMap; import java.util.LinkedList; import java.util.Collections; import java.util.WeakHashMap; import java.lang.ref.SoftReference; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import android.graphics.drawable.Drawable; import android.widget.ImageView; import android.os.Handler; import android.os.Message; import java.io.InputStream; import java.net.MalformedURLException; import java.io.IOException; import java.net.URL; import java.net.URLConnection;
Saya telah mengikuti Pelatihan Android ini dan saya pikir ini melakukan pekerjaan yang sangat baik dalam mengunduh gambar tanpa memblokir UI utama. Ini juga menangani caching dan berurusan dengan menggulir banyak gambar: Memuat Bitmap Besar Secara Efisien
sumber
1. Picasso memungkinkan pemuatan gambar tanpa repot di aplikasi Anda — sering kali dalam satu baris kode!
Gunakan Gradle:
Hanya satu baris kode!
2. Glide Perpustakaan pemuatan dan penyimpanan gambar untuk Android yang berfokus pada pengguliran yang lancar
Gunakan Gradle:
// Untuk tampilan sederhana:
3. fresco adalah sistem yang kuat untuk menampilkan gambar di aplikasi Android.
Memulai dengan Fresco
sumber
Saya telah menulis tutorial yang menjelaskan cara melakukan pemuatan gambar secara malas dalam tampilan daftar. Saya masuk ke beberapa detail tentang masalah daur ulang dan konkurensi. Saya juga menggunakan kumpulan thread tetap untuk mencegah pemijahan banyak thread.
Pemuatan gambar secara malas di Tutorial Listview
sumber
Cara saya melakukannya adalah dengan meluncurkan utas untuk mengunduh gambar di latar belakang dan memberikannya callback untuk setiap item daftar. Ketika sebuah gambar selesai diunduh, ia memanggil panggilan balik yang memperbarui tampilan untuk item daftar.
Metode ini tidak berfungsi dengan baik ketika Anda mendaur ulang tampilan.
sumber
Saya hanya ingin menambahkan satu contoh lagi, XML Adapters . Karena digunakan oleh Google dan saya juga menggunakan logika yang sama untuk menghindari kesalahan OutOfMemory.
Pada dasarnya ImageDownloader ini adalah jawaban Anda (karena mencakup sebagian besar kebutuhan Anda). Beberapa Anda juga dapat menerapkannya.
sumber
Ini adalah masalah umum pada Android yang telah dipecahkan dalam banyak hal oleh banyak orang. Menurut pendapat saya solusi terbaik yang pernah saya lihat adalah perpustakaan yang relatif baru bernama Picasso . Berikut adalah hal-hal penting:
Jake Wharton
dari ActionBarSherlock ketenaran.ListView
Deteksi otomatissumber
Saya telah menggunakan NetworkImageView dari Android Volley Library yang baru
com.android.volley.toolbox.NetworkImageView
, dan sepertinya berfungsi cukup baik. Tampaknya, ini adalah tampilan yang sama yang digunakan di Google Play dan aplikasi Google baru lainnya. Layak untuk dicoba.Tutorial cache gambar voli Google I / O 2013
Pengembang acara Google
sumber
Nah, waktu pemuatan gambar dari Internet memiliki banyak solusi. Anda juga dapat menggunakan perpustakaan Android-Query . Ini akan memberi Anda semua aktivitas yang diperlukan. Pastikan apa yang ingin Anda lakukan dan baca halaman wiki perpustakaan. Dan selesaikan pembatasan pemuatan gambar.
Ini kode saya:
Ini harus menyelesaikan masalah pemuatan malas Anda.
sumber
Saya pikir masalah ini sangat populer di kalangan pengembang Android, dan ada banyak perpustakaan seperti itu yang mengklaim untuk menyelesaikan masalah ini, tetapi hanya beberapa dari mereka yang tampaknya sudah siap. AQuery adalah salah satu perpustakaan seperti itu, tetapi lebih baik daripada kebanyakan dari mereka dalam semua aspek dan layak untuk dicoba.
sumber
Anda harus mencoba Universal Loader ini. Saya menggunakan ini setelah melakukan banyak RnD pada pemuatan malas.
Pemuat Gambar Universal
fitur
Dukungan Android 2.0+
sumber
Lihat Shutterbug , portWebImage ringan (perpustakaan yang bagus di iOS) dari Applidium ke Android. Ini mendukung caching asinkron, menyimpan URL yang gagal, menangani konkurensi dengan baik, dan subkelas yang membantu disertakan.
Permintaan penarikan (dan laporan bug) juga diterima!
sumber
DroidParts memiliki ImageFetcher yang membutuhkan nol konfigurasi untuk memulai.
Klon DroidPartsGram untuk contoh:
sumber
Hanya tip cepat untuk seseorang yang ragu tentang perpustakaan apa yang digunakan untuk memuat gambar yang malas:
Ada empat cara dasar.
DIY => Bukan solusi terbaik tetapi untuk beberapa gambar dan jika Anda ingin pergi tanpa repot menggunakan perpustakaan lain
Volley's Lazy Memuat library => Dari guys di android. Ini bagus dan semuanya tetapi tidak didokumentasikan dengan baik dan karenanya merupakan masalah untuk digunakan.
Picasso: Solusi sederhana yang hanya berfungsi, Anda bahkan dapat menentukan ukuran gambar persis yang ingin Anda bawa. Ini sangat sederhana untuk digunakan tetapi mungkin tidak terlalu "performan" untuk aplikasi yang harus berurusan dengan jumlah gambar yang sangat banyak.
UIL: Cara terbaik untuk malas memuat gambar. Anda dapat men-cache gambar (tentu saja Anda memerlukan izin), menginisialisasi loader sekali, kemudian menyelesaikan pekerjaan Anda. Pustaka pemuatan gambar asinkron yang paling matang yang pernah saya lihat sejauh ini.
sumber
Novoda juga memiliki perpustakaan pemuatan gambar yang malas dan banyak aplikasi seperti Songkick, Podio, SecretDJ, dan ImageSearch menggunakan perpustakaan mereka.
Perpustakaan mereka dihosting di sini di Github dan mereka memiliki pelacak isu yang cukup aktif juga. Proyek mereka tampaknya cukup aktif juga, dengan lebih dari 300 komitmen pada saat menulis balasan ini.
sumber
Periksa garpu LazyList saya . Pada dasarnya, saya meningkatkan LazyList dengan menunda panggilan ImageView dan membuat dua metode:
Saya juga meningkatkan ImageLoader dengan menerapkan singleton pada objek ini.
sumber
Jika Anda ingin menampilkan tata letak Shimmer seperti Facebook, ada perpustakaan facebook resmi untuk itu. FaceBook Shimmer Android
Ini menangani semuanya, Anda hanya perlu meletakkan kode desain yang Anda inginkan dengan cara bersarang di bingkai shimmer. Berikut ini contoh kode.
Dan di sini adalah kode java untuk itu.
Tambahkan ketergantungan ini di file gradle Anda.
Berikut ini tampilannya.
sumber
Semua kode di atas memiliki nilai mereka sendiri tetapi dengan pengalaman pribadi saya coba saja dengan Picasso.
Picasso adalah pustaka khusus untuk tujuan ini, bahkan ia akan mengelola cache dan semua operasi jaringan lainnya secara otomatis. Anda harus menambahkan pustaka dalam proyek Anda dan hanya menulis satu baris kode untuk memuat gambar dari URL jarak jauh.
Silakan kunjungi di sini: http://code.tutsplus.com/tutorials/android-sdk-working-with-picasso--cms-22149
sumber
Gunakan perpustakaan glide. Ini bekerja untuk saya dan akan bekerja untuk kode Anda juga. Ini bekerja untuk gambar maupun gif juga.
sumber
Saya dapat merekomendasikan cara lain yang berfungsi seperti pesona: Android Query.
Anda dapat mengunduh file JAR dari sini
Sebagai contoh:
Ini sangat cepat dan akurat, dan menggunakan ini Anda dapat menemukan lebih banyak fitur seperti animasi saat memuat, mendapatkan bitmap (jika perlu), dll.
sumber
Berikan Aquery mencoba. Ini memiliki metode luar biasa sederhana untuk memuat dan menyimpan gambar secara asinkron.
sumber
URLImageViewHelper adalah pustaka luar biasa yang membantu Anda melakukannya.
sumber
sumber
Saya mengalami masalah ini dan menerapkan lruCache. Saya percaya Anda membutuhkan API 12 dan di atasnya atau menggunakan pustaka compatiblity v4. lurCache adalah memori cepat, tetapi juga memiliki anggaran, jadi jika Anda khawatir bahwa Anda dapat menggunakan diskcache ... Semuanya dijelaskan dalam Caching Bitmaps .
Sekarang saya akan memberikan implementasi saya yang merupakan panggilan tunggal dari mana saja seperti ini:
Berikut adalah kode yang ideal untuk melakukan cache dan kemudian memanggil di atas dalam getView dari adaptor ketika mengambil gambar web:
sumber