Android 通过软引用实现图片缓存,防止内存溢出
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();
}
}
发表评论
-
ScrollView嵌套Edittext
2015-04-08 18:26 856scrollview 中加入多个控件如 edittext 后会 ... -
android 布局式跑马灯,非TextView
2015-04-07 10:51 516如题,简单的实现了跑马灯效果,把Scroll.java放入an ... -
Android圆角图片
2015-03-11 17:44 710my_wane_shape.xml 快速圆角背景边框实现, ... -
SQLite多线程读写实践及常见问题总结
2015-02-13 17:06 968基本操作的部分,大家都很熟悉了,这里根据个人切身经验,总结了一 ... -
android加速度感应
2015-01-19 10:25 14881.android测量数据 (1)android设备坐标系 ... -
MatrixCursor的使用
2015-01-19 09:49 1063ContentProvider对外共享数据的时候的query( ... -
Android 获取控件的宽高高级用法(MeasureSpec)
2015-01-15 14:23 1020一个MeasureSpec封装了父 ... -
Android_GridView_GridView概述及实现水平滑动
2015-01-14 17:14 11601.GridView简介 GridView是ViewGroup ... -
Android MMS,SMS之常用Uri
2014-09-19 16:32 1335Android MMS,SMS之常用Uri Android ... -
android短彩信查询以及MMS表结构
2014-09-19 16:31 2276android短信的数据库的Uri是不公开的, 读取起来时灰常 ... -
使用Android自带DownloadManager下载文件
2014-08-19 11:04 779SDK在API Level 9中加入了DownloadMan ... -
android textview里链接点击事件,增加图片
2014-08-07 16:45 1184Android系统默认给TextView插入图片提供了三种方 ... -
android Home事件汇总
2014-07-18 11:30 1027方法一:android 4.0以后无法通过更改页面的类型来 ... -
Android风格与主题(style and theme)
2014-07-16 16:35 684Android xml风格和主题文 ... -
Android中播放声音的两种方法
2014-05-30 15:09 689在Android中,音频、视 ... -
android 杀进程方法
2014-05-26 17:43 1031关闭应用的方法: 1.System.exit(0); ... -
android service 生命周期
2014-04-21 16:16 802有了 Service 类我们如何启动他呢,有两种方法: ... -
解决ADB端口被占用的问题
2014-04-21 16:14 850究其源就是adb server没启动 经过分析整理如下: ... -
输入法隐藏打开
2013-12-23 14:24 831首次进入activity,如果有个edittex ... -
google经纬度互转
2013-07-11 16:34 951https://developers.google.com/ ...
相关推荐
本教程将讲解如何通过软引用(Soft Reference)来实现图片缓存,从而有效地防止内存溢出。 一、Android内存管理基础 在Android中,内存管理主要依赖于Dalvik或ART虚拟机,它们遵循Java的垃圾回收机制。当对象不再被...
防止内存溢出的关键是了解 Android 加载图片的机制,并掌握一些防止内存溢出的技巧,如使用 BitmapFactory.Options 对图片进行压缩,运用 Java 软引用进行图片缓存,及时回收图片所占的内存等。只有这样,我们才能在...
以下是对Android防止内存溢出的深入浅析: 1. **Android内存管理机制** - **Dalvik/ART虚拟机**:Android系统使用Dalvik或ART虚拟机执行应用程序,它们都有自己的内存管理策略。 - **堆内存**:Java对象主要存储...
综上所述,解决Android图片下载导致的内存溢出问题需要从多个方面进行优化,包括图片尺寸控制、缓存策略、内存管理、加载策略等。结合使用现有的图片加载库,可以显著提高应用性能和用户体验。在实际项目中,...
本篇文章将深入探讨Android内存管理的两个核心概念:堆(Heap)和栈(Stack),以及如何理解和解决Android内存溢出问题。 1. 堆与栈 堆和栈是Java虚拟机(JVM)中的两种主要内存区域,它们各自具有特定的用途和...
使用LRU(Least Recently Used)算法的软引用或弱引用缓存,能在内存不足时自动清除不活跃的对象,防止内存溢出。 **生命周期管理** 理解并正确处理Android组件(如Activity、Service)的生命周期是防止内存溢出的...
7. **优化代码结构**:良好的编程习惯和设计模式有助于防止内存溢出。例如,遵循单一职责原则,避免循环引用,及时释放资源,使用Parcelable而非Serializable等。 8. **系统级别的优化**:了解Android系统的内存...
在Android开发中,图片的加载和内存管理是一个关键问题,特别是考虑到防止因内存溢出(Out Of Memory,简称OOM)而导致应用崩溃。本教程将详细探讨如何在Android中有效地进行图片下载和内存处理,以避免OOM的发生。 ...
本资料"Android应用源码之防止内存溢出浅析"正是针对这一问题提供了解决方案。下面,我们将深入探讨Android应用中内存溢出的原因、检测以及如何通过优化源码来避免。 1. 内存溢出原因: - 大量对象创建:短时间内...
总结,软引用缓存配合异步加载是Android应用中处理图片加载的重要手段,既能提升用户体验,又能有效管理内存,防止内存溢出。通过合理的缓存策略和异步处理,可以构建出高效且稳定的图片加载系统。
本资料包"安卓Android源码——防止内存溢出浅析.zip"主要探讨如何通过深入理解Android源码来预防和处理内存溢出问题。 首先,我们需要了解Android内存模型。Android系统使用Dalvik或ART虚拟机来执行应用,它们都是...
总之,Android图片缓存是提高应用性能的关键技术,通过软硬引用的内存缓存、高效的磁盘缓存和智能的网络缓存策略,我们可以实现快速、稳定且节省资源的图片加载体验。在实际开发中,根据项目需求选择合适的库,并...
这个"Android应用源码之防止内存溢出浅析"的压缩包可能包含了示例代码,通过阅读和分析这些代码,你可以理解以上策略如何在实际项目中应用。例如,查看图片加载部分,是否使用了合适的解码选项;检查Activity的生命...
在Android中,软引用和弱引用常用于图片缓存。例如,当我们加载大量图片时,为了避免内存溢出,可以使用软引用来保存图片对象,这样在内存不足时,这些图片会被自动移除,释放内存。而弱引用则更适合用于临时的、不...
6. **Bitmap优化**:图片加载是Android OOM的常见原因,合理使用Bitmap池,缩放图片,避免加载过大尺寸的图片,可以有效防止内存溢出。 7. **Activity生命周期**:理解Activity的生命周期,避免在onPause、onStop等...
但是,开发者需要注意监控软引用的生命周期,防止内存溢出。 BitmapUtils三层缓存的实现中,通常会结合使用这些技术。在加载图片时,首先检查内存缓存,使用软引用存储Bitmap,这样即使内存紧张也能及时释放。如果...
本篇将深入探讨如何防止安卓应用中的内存溢出,从内存泄漏、大对象分配、Bitmap处理等方面进行详细解析。 一、理解安卓内存管理机制 安卓系统采用Dalvik/ART虚拟机,基于垃圾收集(Garbage Collection,GC)的内存...
5. 加载过程中,为了防止内存溢出,对不再使用的Bitmap资源进行适当的释放。 最后,`ImageManager2`还维护了两个队列:`mImageQueue`和`mRequestQueue`。`mImageQueue`是一个后进先出(LIFO)的数据结构,用于控制...
其次,软引用(SoftReference)在Java中是一种特殊的引用类型,它能够在系统内存不足时,自动清除这些引用的对象,以防止内存溢出。在图片缓存中,软引用可以用来保存图片的原始数据(如Bitmap),在内存紧张时,...