`
liu86th
  • 浏览: 120447 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[转]通过软引用实现图片缓存,防止内存溢出

 
阅读更多

 

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();
    }
}
分享到:
评论

相关推荐

    [教程] 【转】Android 通过软引用实现图片缓存,防止内存溢出 [复制链接]

    本教程将讲解如何通过软引用(Soft Reference)来实现图片缓存,从而有效地防止内存溢出。 一、Android内存管理基础 在Android中,内存管理主要依赖于Dalvik或ART虚拟机,它们遵循Java的垃圾回收机制。当对象不再被...

    加载大图片的时候如何防止内存溢出

    防止内存溢出的关键是了解 Android 加载图片的机制,并掌握一些防止内存溢出的技巧,如使用 BitmapFactory.Options 对图片进行压缩,运用 Java 软引用进行图片缓存,及时回收图片所占的内存等。只有这样,我们才能在...

    Android防止内存溢出浅析.zip

    以下是对Android防止内存溢出的深入浅析: 1. **Android内存管理机制** - **Dalvik/ART虚拟机**:Android系统使用Dalvik或ART虚拟机执行应用程序,它们都有自己的内存管理策略。 - **堆内存**:Java对象主要存储...

    防止内存溢出浅析

    7. **优化代码结构**:良好的编程习惯和设计模式有助于防止内存溢出。例如,遵循单一职责原则,避免循环引用,及时释放资源,使用Parcelable而非Serializable等。 8. **系统级别的优化**:了解Android系统的内存...

    软引用SoftReference缓存图片及异步加载

    总结,软引用缓存配合异步加载是Android应用中处理图片加载的重要手段,既能提升用户体验,又能有效管理内存,防止内存溢出。通过合理的缓存策略和异步处理,可以构建出高效且稳定的图片加载系统。

    android 图片下载 有效解决内存溢出问题

    综上所述,解决Android图片下载导致的内存溢出问题需要从多个方面进行优化,包括图片尺寸控制、缓存策略、内存管理、加载策略等。结合使用现有的图片加载库,可以显著提高应用性能和用户体验。在实际项目中,...

    基于Android防止内存溢出浅析

    使用LRU(Least Recently Used)算法的软引用或弱引用缓存,能在内存不足时自动清除不活跃的对象,防止内存溢出。 **生命周期管理** 理解并正确处理Android组件(如Activity、Service)的生命周期是防止内存溢出的...

    Android 内存溢出问题

    - **利用WeakReference或SoftReference**:这些引用类型可以帮助防止内存泄漏,因为它们不会阻止垃圾回收。 - **设置堆内存使用目标**:通过`VMRuntime.getRuntime().setTargetHeapUtilization(float newTarget)`...

    应用源码之防止内存溢出浅析.zip

    6. **Bitmap优化**:图片加载是Android OOM的常见原因,合理使用Bitmap池,缩放图片,避免加载过大尺寸的图片,可以有效防止内存溢出。 7. **Activity生命周期**:理解Activity的生命周期,避免在onPause、onStop等...

    Android 图片下载以及内存处理防止OOM内存溢出 源码

    在Android开发中,图片的加载和内存管理是一个关键问题,特别是考虑到防止因内存溢出(Out Of Memory,简称OOM)而导致应用崩溃。本教程将详细探讨如何在Android中有效地进行图片下载和内存处理,以避免OOM的发生。 ...

    Bitmap图片的三级缓存DEMO 三层缓存 强引用 软引用DEMO

    但是,开发者需要注意监控软引用的生命周期,防止内存溢出。 BitmapUtils三层缓存的实现中,通常会结合使用这些技术。在加载图片时,首先检查内存缓存,使用软引用存储Bitmap,这样即使内存紧张也能及时释放。如果...

    安卓开发-防止内存溢出浅析.zip

    本篇将深入探讨如何防止安卓应用中的内存溢出,从内存泄漏、大对象分配、Bitmap处理等方面进行详细解析。 一、理解安卓内存管理机制 安卓系统采用Dalvik/ART虚拟机,基于垃圾收集(Garbage Collection,GC)的内存...

    Android应用源码之防止内存溢出浅析.zip

    本资料"Android应用源码之防止内存溢出浅析"正是针对这一问题提供了解决方案。下面,我们将深入探讨Android应用中内存溢出的原因、检测以及如何通过优化源码来避免。 1. 内存溢出原因: - 大量对象创建:短时间内...

    安卓Android源码——防止内存溢出浅析.zip

    本资料包"安卓Android源码——防止内存溢出浅析.zip"主要探讨如何通过深入理解Android源码来预防和处理内存溢出问题。 首先,我们需要了解Android内存模型。Android系统使用Dalvik或ART虚拟机来执行应用,它们都是...

    Android应用源码之防止内存溢出浅析-IT计算机-毕业设计.zip

    这个"Android应用源码之防止内存溢出浅析"的压缩包可能包含了示例代码,通过阅读和分析这些代码,你可以理解以上策略如何在实际项目中应用。例如,查看图片加载部分,是否使用了合适的解码选项;检查Activity的生命...

    ListView优化及加载图片时内存溢出

    在Android开发中,ListView是一个非常常见且重要的组件,它用于展示大量的...通过以上策略,我们可以有效地优化ListView的性能,并防止加载图片时引发内存溢出。在实际开发中,结合具体情况进行调整,以达到最佳效果。

    Android 图片缓存

    总之,Android图片缓存是提高应用性能的关键技术,通过软硬引用的内存缓存、高效的磁盘缓存和智能的网络缓存策略,我们可以实现快速、稳定且节省资源的图片加载体验。在实际开发中,根据项目需求选择合适的库,并...

    完美的网络图片缓存

    4. **内存溢出处理**:Android提供了Bitmap的回收机制,但开发者仍需谨慎处理,防止内存泄漏。使用弱引用或软引用可以避免Bitmap占用内存过久。 5. **缓存库集成**:为了简化开发,许多开发者选择集成现有的图片...

    安卓图片加载缓存相关-引用开源框架通过AsyncHttpClient实现网络图片查看器.rar

    此外,为了实现一个完整的图片查看器,可能还涉及到其他技术,比如图片的滚动优化(防止内存溢出)、图片的缩放处理、以及对不同屏幕尺寸和分辨率的适配等。 在实际运行过程中,如果程序出现无法启动或功能异常的...

Global site tag (gtag.js) - Google Analytics