مقدمة
في الواقع ، أنا محظوظ للغاية. لقد كنت مشغولاً في الآونة الأخيرة بفرصة لتلخيصها اليوم.
مبدأ
مبادئ تحميل الصور في ListView أو GridView هي نفسها في الأساس:
احصل عليه من ذاكرة التخزين المؤقت للذاكرة ، وإرجاعها.
المخطط الانسيابي كما يلي:
في الوقت نفسه ، انتبه إلى عدد المواضيع. بشكل عام ، يتم تحميل الصور في ListView ، يفتح الجميع مؤشرات ترابط جديدة لتحميلها ، ولكن عندما يكون الانزلاق بسرعة ، يكون من السهل التسبب في OOM ، لذلك يجب التحكم في عدد المواضيع. يمكننا التحكم في عدد المواضيع من خلال تجمع الخيوط.
طريقة إنشاء تجمع الخيوط هي كما يلي:
ExecutorService SeviceStors = Executors.netfixedThreadPool (5) ؛
فئة ذاكرة التخزين المؤقت للملف
استيراد java.io.file ؛ OS.Environment.getExternalStoragEstate (). ) {cachedir.mkders () ؛}} ملف getFile (url string) {// تحديد الصور بواسطة ملف تراكم عنوان URL = string.valueof (url.hashcode ()) ؛ ؛ فئة ذاكرة التخزين المؤقت للذاكرة
فيما يلي مرجعًا ناعمًا ، خريطة ، ذاكرة التخزين المؤقت SoftReference <bitmap >> ، يمكنك ببساطة وضعها: يتم تنفيذ الخريطة.
استيراد java.ref.softrefere المجموعات Ref.get () ؛} public void pub (string id ، bitmap bitmap) {cache.put (id ، softreference <bit map> (bitmap) ؛} public void clear () {cache.clear () ؛}}فئة تحميل الصور
استيراد java.io. util.colds .bitmapfactory ؛ ذاكرة التخزين المؤقت Image * / MemoryCache = New MemoryCache () ؛ SynchronizedMap (New DeferHashMap <ImageView ، String> ()) ؛ {FileCache = New FileCache (سياق) ؛ صورة من الذاكرة ذاكرة التخزين المؤقت ImageView.setImageBitMap (bitmap) ؛} آخر {// عرض من ذاكرة التخزين المؤقت للملف أو شبكة Queuephoto (url ، imagev iew) ؛}} private void queuephoto (url url ، ImageView imageView) {phototoload phototoload = new phototoload ، ImageView) ؛ {return bmp ؛} من الشبكة {bitmap bitmap = null ؛ (True) ؛ {if (exstanceof OutofMemory) {clearCache () ؛ . القراءة (البايت ، 0 ، buffer_size) ؛ و) {MemoryCache.clear () ؛ URL ، ImageView ImageView) {this.url = url ؛ ) {this.phototoload = phototoload ؛} imageViewReused boolean (photoToload) ||! tag.equals (phototoload.url)) Bitmap bitmap = getBitMap (phototoload.url) ؛ Bitmapdisplayer (Bitmap, PhotoToload); Handler.post (BD);} Class Bitmapdisplayer IMPLEMENTS Runnable {BI TMAP BITMAP; PhotoToload PhotoToload; Public Bitmapdisplayer (bitmap bitmap, Photoload PhotoLoad) {this.bitmap = bitmap; this. PhotoLoad = PHOTOTOLOAD;} Override public void run () {if (imageViewReused (phototoload)) {return ؛} if (bitmap! = null) oad.imageView.setImageBitMap (bitmap) ؛} آخر {phototoload.imageview.setimageresource (default_bg) ؛}}}}} }}طريقة الاتصال
ImageLoader ImageLoader = New ImageLoader (Context) ؛