当前位置:首页 » 安卓系统 » android加载图片溢出

android加载图片溢出

发布时间: 2023-05-30 16:04:16

‘壹’ android中用viewflipper来放大量图片时,内存溢出,求助

创建太多图片而不注意回收容易导致内存溢出啊位图很占内存的,而且占的好像是native内存建议创建图片用弱引用包装
或者
自己回收一下

‘贰’ 如何解决Android内存溢出

模拟器RAM比较小,只有8M内存,当我放入的大量的图片(每个100多K左右),就出现上面的原因。由于每张图片先前是压缩的情况。放入到Bitmap的时候,大小会变大,导致超出RAM内存,具体解决办法如下://解决加载图片内存溢出的问题
//Options只保存图片尺寸大小,不保存图片到内存
BitmapFactory.Optionsopts=newBitmapFactory.Options();
/*缩放的比例,缩放是很难按准备的比例进行缩放的,其值表明缩放的倍数,SDK中建议其值是2的指数值,值越大会导致图片不清晰*/
opts.inSampleSize=4;
//回收bmp.recycle();还可以用到优化Dalvik虚拟机的堆内存分配对于Android平台来说,其托管层使用的DalvikjavaVM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,这里我们仅说下使用方法:privatefinalstaticfloatTARGET_HEAP_UTILIZATION=0.75f;在程序onCreate时就可以调用VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);Android堆内存也可自己定义大小对于一些Android项目,影响性能瓶颈的主要是Android自己内存管理机制问题,除了优化Dalvik虚拟机的堆内存分配外,我们还可以强制定义自己软件的对内存大小,我们使用Dalvik提供的dalvik.system.VMRuntime类来设置最小堆内存为例:privatefinalstaticintCWJ_HEAP_SIZE=6*1024*1024;VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);//设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理

‘叁’ 如何定位和解决android的内存溢出问题

进公司的第一个项目就遇到了一个比较难缠的客户,不过总算对付过去了。在第一个项目中由于app加载的图片、报表比较多,所以经常报出内存溢出的错误,很是头疼。不过在project leader的带领下,基本算是解决了。在此感谢一下my leader,Samuel.Cai辛苦了。哈哈......
以下是一些总结,ps:从我leader那边搞过来的,和大家分享一下,哈哈
1. 当项目中包含大量图片,或者图片过大,可能会oom

方法1 : 等比例缩小图片

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;

方法2 : 对图片采用软引用,及时地进行recyle()操作

SoftReference<Bitmap> bitmap;
bitmap = new SoftReference<Bitmap>(pBitmap);
if(bitmap != null){

if(bitmap.get() != null && !bitmap.get().isRecycled()){
bitmap.get().recycle();
bitmap = null;
}
}

方法3 : 对复杂的listview进行合理设计与编码:
1. 注意重用Adapter里面的 convertView 以及holder机制的运用 ----- 参考资料: api demo list 14. Efficient Adapter

public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
v = mInflater.inflate(resource, parent, false);
final int[] to = mTo;
final int count = to.length;
final View[] holder = new View[count];
for (int i = 0; i < count; i++) {
holder[i] = v.findViewById(to[i]);
}
v.setTag(holder);
} else {



2. 上述方法尝试还未成功,可用 lazy loading data ----- 参考资料:api demo list 13

方法4 : 单个页面,横竖屏切换N次后 OOM
1. 看看页面布局当中有没有大的图片,比如背景图之类的。去除xml中相关设置,改在程序中设置背景图(放在onCreate()方法中):
Drawable bg = getResources().getDrawable(R.drawable.bg);
XXX.setBackgroundDrawable(rlAdDetailone_bg);
在Activity destory时注意,bg.setCallback(null); 防止Activity得不到及时的释放

2. 跟上面方法相似,直接把xml配置文件加载成view 再放到一个容器里,然后直接调用 this.setContentView(View view);方法

避免xml的重复加载

方法5 : 在页面切换时尽可能少地重复使用一些代码,比如:重复调用数据库,反复使用某些对象等等......

方法6 :Android堆内存也可自己定义大小 和 优化Dalvik虚拟机的堆内存分配
注意若使用这种方法:project build target 只能选择 <= 2.2 版本,否则编译将通不过。 所以不建议用这种方式

private final static int CWJ_HEAP_SIZE= 6*1024*1024;
private final static float TARGET_HEAP_UTILIZATION = 0.75f;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);

‘肆’ android bitmap 从网络获取图片并处理问题 溢出

在 Java中,JavaVM拥有自动管理内存的功能,Java的GC能够进行垃圾回收,但是如果ImageView使用过多的Bitmap的话,经常会报OOM(内存溢出)。

造成内存溢出及解决方案:

  1. 使用BitmapFactory.decodeStream替代createBitmap方法

    原因是该方法直读取图片字节,调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap。

  2. 使用压缩读取技术

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;

BitmapFactory.decodeFile(imageSdUri, options);

final int height = options.outHeight;

final int width = options.outWidth;

options.inSampleSize = 1;

int w = 320;

int h = 480;

h = w*height/width;//计算出宽高等比率

int a = options.outWidth/ w;

int b = options.outHeight / h;

options.inSampleSize = Math.max(a, b);

options.inJustDecodeBounds = false;

Bitmap bitmap = BitmapFactory.decodeFile(imageSdUri, options);


3.及时释放Bitamp
Bitmap对象在不使用时,我们应该先调用recycle()释放内存,然后才它设置为null.虽然recycle()从源码上看,调用它应该能立即释放Bitmap的主要内存,但是测试结果显示它并没能立即释放内存。但是我它应该还是能大大的加速Bitmap的主要内存的释放。

‘伍’ Android内存溢出问题

一、内存溢出 现在的智能手机内存已经足够大,但是对于一个应用程序来说智能手机当中稀缺的内存,仍然是应用程序的一大限制。在Android应用程序开发当中,最常见的内存溢出问题(OOM)是在加载图片时出现的,尤其是在不知道图片大小的情况下。 潜在的内存溢出操作主要包括以下几点: 1、从网络当中加载用户特定的图片。因为直搭誉到我们在下载图片的时候我们才知道图片的大小。 2、向Gallery加载图片。因为现在智能手机的摄像头有很高的分辨率,在加载图片的时候需要最图片进行处理,然后才能正常的使用。 请注意一点,Android系统是从系统全局的观念来分配内存以加载图片的,这就意味着,即使你的应用有足够大的内存可用,内存溢出问题(out of memroy,OOM)仍然可能出现,因为所有的应用共享一个加载图片的内存池(我们使用BitmapFactory进行解析)。 二、解决内存溢出问题 原文(Downsampling为了好理解,解释为,程序知判段A)。程序A通过调整像素,同时使其均衡化来降低图片的分辨率。因为不管问题图片是因为太大而不能再手机上正常显现,这个图片都会缩短其宽度以在ImageView当中显示,当图片在ImageView当中显示时,我们会因为加载一些没有必要的原始图片而浪费掉内存。 因此,更加有效冲胡的加载图片的时机是在其初始化处理的时候。 以下是处理代码: 1: private static Bitmap getResizedImage(String path, byte[] data, int targetWidth){2:3: BitmapFactory.Options options = new BitmapFactory.Options(); 14: options.inSampleSize = ssize;15:16: Bitmap bm = null;17: try{18: bm = decode(path, data, options); 19: }catch(OutOfMemoryError e){ 39: result = result * 2;40:41: }42:43: return result;44: }三、AQuery当在Android应用程序开发当中使用AQuery组件时,处理这个问题会变的更加的简单。

热点内容
南山存储器设备供应商哪家质量好 发布:2025-02-10 23:46:50 浏览:416
安卓沼泽激战哪里下载 发布:2025-02-10 23:45:03 浏览:260
网站服务器如何连接光纤 发布:2025-02-10 23:42:29 浏览:729
组合键脚本 发布:2025-02-10 23:32:43 浏览:552
安卓篮球手游在哪里下 发布:2025-02-10 23:21:55 浏览:133
linux改变所有者 发布:2025-02-10 23:04:13 浏览:650
源码曹毅 发布:2025-02-10 23:04:01 浏览:582
odbcforsqlserver 发布:2025-02-10 22:26:37 浏览:600
区块链数据存储在那里 发布:2025-02-10 22:25:48 浏览:689
c语言for死循环 发布:2025-02-10 22:24:08 浏览:523