Kata pengantar
Bahkan, saya sangat beruntung. Baru -baru ini, saya telah sibuk dengan kesempatan untuk meringkas.
prinsip
Prinsip -prinsip memuat gambar di ListView atau GridView pada dasarnya sama:
Dapatkan dari cache memori, dan kembalikan.
Diagram alurnya adalah sebagai berikut:
Pada saat yang sama, perhatikan jumlah utas. Secara umum, memuat gambar di ListView, semua orang membuka utas baru untuk dimuat, tetapi ketika dengan cepat meluncur, mudah untuk menyebabkan OOM, sehingga jumlah utas perlu dikontrol. Kami dapat mengontrol jumlah utas melalui kumpulan utas.
Metode membangun kumpulan utas adalah sebagai berikut:
ExecutorService ExecutorService = Executors.NetFixedThreadPool (5);
Kelas Cache File
Impor Java.io.file; Os.environment.getExternalStorAgeState (). ) {cachedir.mkders ();}} File publik getFile (string url) {// Identifikasi gambar dengan kode hash URL string filename = string.valueof (URL.HashCode ()); ; Kelas cache memori
Berikut adalah referensi yang lembut, peta <string, softreference <bitmap>> cache, Anda dapat Google ke mekanisme referensi yang lembut.
Impor Java.util.collection. Koleksi Ref.get ();} public void put (ID string, bitmap bitmap) {cache.put (id, softreference baru <bit peta> (bitmap);} public void clear () {cache.clear ();} E}Kelas pemuatan gambar
Impor Java.io.file; UTIL.COLLECTION; .BitmapFactory; Cacaran * / MemoryCache MemoryCache = New MemoryCache (); SynchronizedMap (New WeastHashMap <Imageview, String, String> ()); {FileCache = FileCache baru (konteks) ;; IMAGE from Memory Cache ImageView.SetimageBitmap (Bitmap);} Else {// Display from FILE CACHE or Network QueuePhoto (URL, ImageV IEW);}} Private Void QueuePhoto (String URL, ImageView ImageView) {Phototoload PhotoToload = New PHOTOTOLOAD (URL , Imageview); {Return BMP;} // dari jaringan coba {bitmap bitmap = null URL ImageUrl = URL baru (URL); (True); {if (exstanceof outofmemoryError) {clearcache ();} private void copystream (inputStream adalah, outputStream OS) {int buffer_size = 1024; .read (bytes, 0, buffer_size); F) {coba {// TODO: Compress Image Size FileInputStream = FileInputStream baru (f); {Memorycache.clear (); URL, ImageView Imageview) {this.url = url; ) {This.photoTOLoad = PhotoToload;} private boolean imageviewreused (photoToload photoload) {string tag = imageviews.get (phototoload.im.im.im.im.im.im.im Ageview); ||! bitmap bitmap = getBitmap (phototoload.url); BitmapDisPlayer (Bitmap, PhotoToload); @Override public void run () {if (ImageViewReused (photoToload)) {return;} if (bitmap! = Null) oad.imageView.setImageBitMap (bitmap);} else {phototoload.imageView.setimagereSource (default_bg); }}Metode panggilan
ImageLoader ImageLoader = New ImageLoader (konteks);