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();
}
}
分享到:
相关推荐
本教程将讲解如何通过软引用(Soft Reference)来实现图片缓存,从而有效地防止内存溢出。 一、Android内存管理基础 在Android中,内存管理主要依赖于Dalvik或ART虚拟机,它们遵循Java的垃圾回收机制。当对象不再被...
防止内存溢出的关键是了解 Android 加载图片的机制,并掌握一些防止内存溢出的技巧,如使用 BitmapFactory.Options 对图片进行压缩,运用 Java 软引用进行图片缓存,及时回收图片所占的内存等。只有这样,我们才能在...
以下是对Android防止内存溢出的深入浅析: 1. **Android内存管理机制** - **Dalvik/ART虚拟机**:Android系统使用Dalvik或ART虚拟机执行应用程序,它们都有自己的内存管理策略。 - **堆内存**:Java对象主要存储...
7. **优化代码结构**:良好的编程习惯和设计模式有助于防止内存溢出。例如,遵循单一职责原则,避免循环引用,及时释放资源,使用Parcelable而非Serializable等。 8. **系统级别的优化**:了解Android系统的内存...
总结,软引用缓存配合异步加载是Android应用中处理图片加载的重要手段,既能提升用户体验,又能有效管理内存,防止内存溢出。通过合理的缓存策略和异步处理,可以构建出高效且稳定的图片加载系统。
综上所述,解决Android图片下载导致的内存溢出问题需要从多个方面进行优化,包括图片尺寸控制、缓存策略、内存管理、加载策略等。结合使用现有的图片加载库,可以显著提高应用性能和用户体验。在实际项目中,...
使用LRU(Least Recently Used)算法的软引用或弱引用缓存,能在内存不足时自动清除不活跃的对象,防止内存溢出。 **生命周期管理** 理解并正确处理Android组件(如Activity、Service)的生命周期是防止内存溢出的...
- **利用WeakReference或SoftReference**:这些引用类型可以帮助防止内存泄漏,因为它们不会阻止垃圾回收。 - **设置堆内存使用目标**:通过`VMRuntime.getRuntime().setTargetHeapUtilization(float newTarget)`...
6. **Bitmap优化**:图片加载是Android OOM的常见原因,合理使用Bitmap池,缩放图片,避免加载过大尺寸的图片,可以有效防止内存溢出。 7. **Activity生命周期**:理解Activity的生命周期,避免在onPause、onStop等...
在Android开发中,图片的加载和内存管理是一个关键问题,特别是考虑到防止因内存溢出(Out Of Memory,简称OOM)而导致应用崩溃。本教程将详细探讨如何在Android中有效地进行图片下载和内存处理,以避免OOM的发生。 ...
但是,开发者需要注意监控软引用的生命周期,防止内存溢出。 BitmapUtils三层缓存的实现中,通常会结合使用这些技术。在加载图片时,首先检查内存缓存,使用软引用存储Bitmap,这样即使内存紧张也能及时释放。如果...
本篇将深入探讨如何防止安卓应用中的内存溢出,从内存泄漏、大对象分配、Bitmap处理等方面进行详细解析。 一、理解安卓内存管理机制 安卓系统采用Dalvik/ART虚拟机,基于垃圾收集(Garbage Collection,GC)的内存...
本资料"Android应用源码之防止内存溢出浅析"正是针对这一问题提供了解决方案。下面,我们将深入探讨Android应用中内存溢出的原因、检测以及如何通过优化源码来避免。 1. 内存溢出原因: - 大量对象创建:短时间内...
本资料包"安卓Android源码——防止内存溢出浅析.zip"主要探讨如何通过深入理解Android源码来预防和处理内存溢出问题。 首先,我们需要了解Android内存模型。Android系统使用Dalvik或ART虚拟机来执行应用,它们都是...
这个"Android应用源码之防止内存溢出浅析"的压缩包可能包含了示例代码,通过阅读和分析这些代码,你可以理解以上策略如何在实际项目中应用。例如,查看图片加载部分,是否使用了合适的解码选项;检查Activity的生命...
在Android开发中,ListView是一个非常常见且重要的组件,它用于展示大量的...通过以上策略,我们可以有效地优化ListView的性能,并防止加载图片时引发内存溢出。在实际开发中,结合具体情况进行调整,以达到最佳效果。
总之,Android图片缓存是提高应用性能的关键技术,通过软硬引用的内存缓存、高效的磁盘缓存和智能的网络缓存策略,我们可以实现快速、稳定且节省资源的图片加载体验。在实际开发中,根据项目需求选择合适的库,并...
4. **内存溢出处理**:Android提供了Bitmap的回收机制,但开发者仍需谨慎处理,防止内存泄漏。使用弱引用或软引用可以避免Bitmap占用内存过久。 5. **缓存库集成**:为了简化开发,许多开发者选择集成现有的图片...
此外,为了实现一个完整的图片查看器,可能还涉及到其他技术,比如图片的滚动优化(防止内存溢出)、图片的缩放处理、以及对不同屏幕尺寸和分辨率的适配等。 在实际运行过程中,如果程序出现无法启动或功能异常的...