`
zcwfeng
  • 浏览: 106583 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

android防止内存溢出浅析(一)

 
阅读更多
做android游戏开发有一段时间了,对于开发中遇到额OutOfMemory 异常真的是很头疼,今天就在此总结下。

游戏开发中遇到的内存溢出基本上都是出现在加载Bitmap的时候 ,原因是Bitmap实在是太占内存了,尤其是对于高分辨率的的图片一定要小心使用了。

下面就罗列出三点解决使用Bitmap时出现的内存溢出问题的方案:

一.及时的销毁:

虽然,系统能够确认Bitmap分配的内存最终会被销毁,但是由于它占用的内存过多,所以很可能会超过java堆的限制。因此,在用完Bitmap时,要及时的recycle掉。recycle并不能确定立即就会将Bitmap释放掉,但是会给虚拟机一个暗示:“该图片可以释放了”。

二. 设置一定的采样率:

有时候,我们要显示的区域很小,没有必要将整个图片都加载出来,而只需要记载一个缩小过的图片,这时候可以设置一定的采样率,那么就可以大大减小占用的内存。如下面的代码:

private ImageView preview;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri),
null, options);
preview.setImageBitmap(bitmap);

三、巧妙的运用软引用(SoftRefrence)
有些时候,我们使用Bitmap后没有保留对它的引用,因此就无法调用Recycle函数。这时候巧妙的运用软引用,可以使Bitmap在内存快不足时得到有效的释放。如下例:

private class MyAdapter extends BaseAdapter {

private ArrayList mBitmapRefs = new ArrayList();
private ArrayList mValues;
private Context mContext;
private LayoutInflater mInflater;

MyAdapter(Context context, ArrayList values) {
mContext = context;
mValues = values;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return mValues.size();
}

public Object getItem(int i) {
return mValues.get(i);
}

public long getItemId(int i) {
return i;
}

public View getView(int i, View view, ViewGroup viewGroup) {
View newView = null;
if(view != null) {
newView = view;
} else {
newView =(View)mInflater.inflate(R.layout.image_view, false);
}

Bitmap bitmap = BitmapFactory.decodeFile(mValues.get(i).fileName);
mBitmapRefs.add(new SoftReference(bitmap)); //此处加入ArrayList
((ImageView)newView).setImageBitmap(bitmap);

return newView;
}
}
分享到:
评论

相关推荐

    Android防止内存溢出浅析.zip

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

    Android防止内存溢出浅析

    在Android开发中,防止内存溢出是一个至关重要的任务,因为Android设备的内存资源相对有限,尤其是在Dalvik虚拟机中,其最大堆大小通常只有16MB。本文将深入探讨Android平台上的内存管理机制,以及如何避免内存泄露...

    基于Android防止内存溢出浅析

    理解并正确处理Android组件(如Activity、Service)的生命周期是防止内存溢出的关键。当组件不再使用时,应及时释放资源,如关闭数据库连接,停止正在执行的后台任务,解除对其他对象的引用。 **使用WeakReference...

    防止内存溢出浅析

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

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

    本资料"安卓Android源码——防止内存溢出浅析"将深入探讨如何在Android源码层面理解和预防内存溢出。 首先,了解Android内存结构是必要的。Android内存分为堆内存和栈内存,Java对象主要存储在堆中,而局部变量和...

    Android应用源码之防止内存溢出浅析.zip项目安卓应用源码下载

    Android应用源码之防止内存溢出浅析.zip项目安卓应用源码下载Android应用源码之防止内存溢出浅析.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

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

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

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

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

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

    本资料"应用源码之防止内存溢出浅析"旨在深入探讨Android应用中的内存优化,帮助开发者避免因不当使用内存导致的应用崩溃。以下是根据标题、描述和标签提炼的相关知识点: 1. **Java内存模型**:Java内存分为堆内存...

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

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

    Android编程内存溢出与防范方法浅析

    在Android编程中,内存溢出(Memory Leak)是一个常见的问题,尤其对于有限的移动设备资源而言,内存管理显得尤为重要。Android的Dalvik虚拟机虽然在内存管理上与Java虚拟机有相似之处,但由于其内存限制(通常是16...

    android源码包集合4

    zz-doctor中医大夫助理...防止内存溢出浅析.rar 飞行历 飞行模式 AirPlus.rar 飞行射击类游戏源码.rar 高仿 WIN8系统 磁贴点击下沉倾斜效果源码.zip 高仿基于android2.2(Froyo)的Contacts.zip 高仿多米音乐播放器.rar

    浅析安卓(Android)的性能优化

    3. 使用Bitmap时注意内存控制:Bitmap对象占用了大量内存,我们需要合理地加载、解码和复用Bitmap,使用BitmapFactory.Options来控制解码时的大小,避免一次性加载过大图像导致内存溢出。 4. 利用Android提供的内存...

    浅析KJFrameForAndroid框架如何高效加载Bitmap

    然而,由于内存限制,直接加载大尺寸的Bitmap可能导致内存溢出(OOM)异常,因此高效地加载和管理Bitmap至关重要。KJFrameForAndroid是一个开源的Android应用开发框架,它提供了一种优化的Bitmap加载策略来避免此类...

Global site tag (gtag.js) - Google Analytics