คำนำ
ในความเป็นจริงฉันโชคดีมาก เมื่อเร็ว ๆ นี้ฉันยุ่งอยู่กับโอกาสที่จะสรุป
หลักการ
หลักการของการโหลดรูปภาพใน ListView หรือ GridView นั้นเหมือนกัน:
รับจากแคชหน่วยความจำและส่งคืน
ผังงานมีดังนี้:
ในเวลาเดียวกันให้ความสนใจกับจำนวนเธรด โดยทั่วไปการโหลดรูปภาพใน ListView ทุกคนจะเปิดเธรดใหม่เพื่อโหลด แต่เมื่อเลื่อนอย่างรวดเร็วมันเป็นเรื่องง่ายที่จะทำให้เกิด oom ดังนั้นจำนวนเธรดจะต้องถูกควบคุม เราสามารถควบคุมจำนวนเธรดผ่านพูลเธรด
วิธีการสร้างพูลเธรดมีดังนี้:
ExecutorService ExecutorService = Executors.netFixedThreadPool (5);
คลาสแคชไฟล์
นำเข้า java.io.file; นำเข้า Android.content.context; OS.environment.getExternalStoragestate () ) {cachedir.mkders ();}} ไฟล์สาธารณะ getFile (url string) {// ระบุภาพโดยรหัสแฮชสตริงของ URL ชื่อไฟล์ filename = string.valueof (url.hashCode ()); ; return f;} public void clear () {files = cachedir.listfiles (); คลาสแคชหน่วยความจำ
นี่คือการอ้างอิงที่นุ่มนวลแผนที่ <สตริง softreference <bitmap >> แคชคุณสามารถใช้ Google ไปยังกลไกการอ้างอิงที่นุ่มนวล
นำเข้า java.lang.ref.softreference; คอลเลกชัน Ref.get ();} โมฆะสาธารณะใส่ (String ID, บิตแมปบิตแมป) {cache.put (id, softreference ใหม่ <bit map> (bitmap);} โมฆะสาธารณะ Clear () {cache.clear ();}}}}}}}คลาสโหลดรูปภาพ
นำเข้า Java.io.File; util.collections; .Bitmapfactory; นำเข้า Android.os.handler; Cache * / MemoryCache MemoryCache = New MemoryCache (); SynchronizedMap (New WeakhashMap <ImageView, String, String> ()); {FileCache = New FileCache (บริบท) ;; ภาพจากหน่วยความจำแคช imageView.SetImageBitMap (บิตแมป);} else {// แสดงจากไฟล์แคชไฟล์หรือเครือข่าย queuephoto (url, imagev iew);}} โมฆะส่วนตัว queuephoto (url string imageView) , imageView); {return bmp;} // จากเครือข่ายลอง {bitmap bitmap = null; (จริง); {ถ้า (exstanceof outofmemoryError) {clearCache ();} โมฆะส่วนตัว copyStream (อินพุตสตรีมคือ OutputStream OS) {int buffer_size = 1024; . read (bytes, 0, buffer_size); ถ้า (count == -1) {break;} os.wri te (te bytes, 0, count); f) {ลอง {// todo: บีบอัดภาพขนาดของภาพ FileInputStream = ใหม่ FileInputStream (F); {MemoryCache.Clear (); url, imageView imageView) {this.url = url; this.imageView = imageView;} / ** * asynchronous เพื่อโหลดการเลือก * * @author Zhengyi.wzy * * / คลาสถ่ายภาพ ) {this.phototoload = phototoLoad;} บูลีนส่วนตัว imageViewReused (phototoload photoLoad) {String tag = imageViews.get (phototoload.im.im.im.im.im.im.im.im AgeView); || แท็ก. equals (phototoload.url)) {return true;} return false;} @Override โมฆะสาธารณะ Run () {// ยกเลิกเธรดปัจจุบันถ้า IM Age View นำกลับมาใช้ใหม่หาก (ImageViewReused (phototoload)) {return;} บิตแมปบิตแมป = getBitMap (phototoload.url); bitmapdisplayer (บิตแมป, phototoload); @Override โมฆะสาธารณะ Run () {ถ้า (imageViewReused (phototoLoad)) {return;} ถ้า (บิตแมป! = null) oad.imageView.setImageBitMap (bitmap);} else {phototoload.imageView. }}วิธีการโทร
imageLoader imageLoader = imageLoader ใหม่ (บริบท);