• Android 通过软引用实现图片缓存,防止内存溢出


    public class BitmapCache {
        static private BitmapCache cache;
        /** 用于Chche内容的存储 */
        private Hashtable<Integer, MySoftRef> hashRefs;
        /** 垃圾Reference的队列(所引用的对象已经被回收,则将该引用存入队列中) */
        private ReferenceQueue<Bitmap> q;
    
        /**
         * 继承SoftReference,使得每一个实例都具有可识别的标识。
          */
        private class MySoftRef extends SoftReference<Bitmap> {
            private Integer _key = 0;
    
            public MySoftRef(Bitmap bmp, ReferenceQueue<Bitmap> q, int key) {
                super(bmp, q);
                _key = key;
            }
        }
    
        private BitmapCache() {
            hashRefs = new Hashtable<Integer, MySoftRef>();
            q = new ReferenceQueue<Bitmap>();
        }
    
        /**
         * 取得缓存器实例
          */
        public static BitmapCache getInstance() {
            if (cache == null) {
                cache = new BitmapCache();
            }
            return cache;
        }
    
        /**
         * 以软引用的方式对一个Bitmap对象的实例进行引用并保存该引用
          */
        private void addCacheBitmap(Bitmap bmp, Integer key) {
            cleanCache();// 清除垃圾引用
             MySoftRef ref = new MySoftRef(bmp, q, key);
            hashRefs.put(key, ref);
        }
    
        /**
         * 依据所指定的drawable下的图片资源ID号(可以根据自己的需要从网络或本地path下获取),重新获取相应Bitmap对象的实例
         */
        public Bitmap getBitmap(int resId, Context context) {
            Bitmap bmp = null;
            // 缓存中是否有该Bitmap实例的软引用,如果有,从软引用中取得。
             if (hashRefs.containsKey(resId)) {
                MySoftRef ref = (MySoftRef) hashRefs.get(resId);
                bmp = (Bitmap) ref.get();
            }
            // 如果没有软引用,或者从软引用中得到的实例是null,重新构建一个实例,
             // 并保存对这个新建实例的软引用
             if (bmp == null) {
                // 传说decodeStream直接调用JNI>>nativeDecodeAsset()来完成decode,
                  // 无需再使用java层的createBitmap,从而节省了java层的空间。
                  bmp = BitmapFactory.decodeStream(context.getResources()
                        .openRawResource(resId));
                this.addCacheBitmap(bmp, resId);
            }
            return bmp;
        }
    
        private void cleanCache() {
            MySoftRef ref = null;
            while ((ref = (MySoftRef) q.poll()) != null) {
                hashRefs.remove(ref._key);
            }
        }
    
        /**
         * 清除Cache内的全部内容
         */
        public void clearCache() {
            cleanCache();
            hashRefs.clear();
            System.gc();
            System.runFinalization();
        }
    }
  • 相关阅读:
    Windows7 64位 安装mysql
    汉诺塔(hanoi)
    大数据时代,Python是最好的语言!
    本地项目上传到github
    函数去抖(debounce)与 函数节流(throttle)
    vue项目出现的错误汇总
    vue-cli + webpack自动生成项目
    webpack和gulp
    前端开发利器之静态服务器
    vue开发知识点汇总
  • 原文地址:https://www.cnblogs.com/merryjd/p/2863180.html
Copyright © 2020-2023  润新知