引用:http://my.eoe.cn/littlebirds/archive/4646.html

尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,
因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。

因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source,decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。

如果在读取时加上图片的Config参数,可以跟有效减少加载的内存,从而跟有效阻止抛out of Memory异常
另外,decodeStream直接拿的图片来读取字节码了, 不会根据机器的各种分辨率来自动适应, 使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源, 否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。

另外,以下方式也大有帮助:

12345
InputStream is = this.getResources().openRawResource(R.drawable.pic1);     BitmapFactory.Options options=new BitmapFactory.Options();     options.inJustDecodeBounds = false;     options.inSampleSize = 10;   //width,hight设为原来的十分一     Bitmap btp =BitmapFactory.decodeStream(is,null,options);
1234
if(!bmp.isRecycle() ){         bmp.recycle()   //回收图片所占的内存         system.gc()  //提醒系统及时回收}

以下奉上一个方法:

``java
/**
* 以最省内存的方式读取本地资源的图片
* @param context
* @param resId
* @return
*/

public static Bitmap readBitMap(Context context, int resId){

BitmapFactory.Options opt = new BitmapFactory.Options();

opt.inPreferredConfig = Bitmap.Config.RGB_565;

opt.inPurgeable = true;

opt.inInputShareable = true;

//获取资源图片

InputStream is = context.getResources().openRawResource(resId);

return BitmapFactory.decodeStream(is,null,opt);

}

 1 2 3 4 5 6 7 8 91011121314151617181920212223
================================================================================Android内存溢出的解决办法转自:http://www.cppblog.com/iuranus/archive/2010/11/15/124394.html?opt=admin昨天在模拟器上给gallery放入图片的时候,出现java.lang.OutOfMemoryError: bitmap size exceeds VM budget 异常,图像大小超过了RAM内存。      模拟器RAM比较小,只有8M内存,当我放入的大量的图片(每个100多K左右),就出现上面的原因。由于每张图片先前是压缩的情况,放入到Bitmap的时候,大小会变大,导致超出RAM内存,具体解决办法如下:```java//解决加载图片 内存溢出的问题                    //Options 只保存图片尺寸大小,不保存图片到内存                BitmapFactory.Options opts = new BitmapFactory.Options();                //缩放的比例,缩放是很难按准备的比例进行缩放的,其值表明缩放的倍数,SDK中建议其值是2的指数值,值越大会导致图片不清晰                opts.inSampleSize = 4;                Bitmap bmp = null;                bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts);                                             ...                             //回收                bmp.recycle();

通过上面的方式解决了,但是这并不是最完美的解决方式。

通过一些了解,得知如下:

优化Dalvik虚拟机的堆内存分配

对于Android平台来说,其托管层使用的Dalvik JavaVM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,这里我们仅说下使用方法: private final static floatTARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate时就可以调用VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);即可。

Android堆内存也可自己定义大小

对于一些Android项目,影响性能瓶颈的主要是Android自己内存管理机制问题,目前手机厂商对RAM都比较吝啬,对于软件的流畅性来说RAM对性能的影响十分敏感,除了 优化Dalvik虚拟机的堆内存分配外,我们还可以强制定义自己软件的对内存大小,我们使用Dalvik提供的dalvik.system.VMRuntime类来设置最小堆内存为例:

private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;

VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理

bitmap 设置图片尺寸,避免 内存溢出 OutOfMemoryError的优化方法
★android 中用bitmap 时很容易内存溢出,报如下错误:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget

● 主要是加上这段:

12
BitmapFactory.Options options = new BitmapFactory.Options();                options.inSampleSize = 2;

● eg1:(通过Uri取图片)

123456
private ImageView preview;BitmapFactory.Options options = new BitmapFactory.Options();                    options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一                    Bitmap bitmap = BitmapFactory.decodeStream(cr                            .openInputStream(uri), null, options);                    preview.setImageBitmap(bitmap);

以上代码可以优化内存溢出,但它只是改变图片大小,并不能彻底解决内存溢出。
● eg2:(通过路径去图片)

1234567
private ImageView preview;private String fileName= "/sdcard/DCIM/Camera/2010-05-14 16.01.44.jpg";BitmapFactory.Options options = new BitmapFactory.Options();                options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一                        Bitmap b = BitmapFactory.decodeFile(fileName, options);                        preview.setImageBitmap(b);                        filePath.setText(fileName);

更多相关文章

  1. android通过http上传文件(图片)
  2. Android绘制进阶之三:在位图上(Bitmap)绘制位图(Bitmap)
  3. Android(安卓)background背景图片平铺
  4. Android(安卓)android-common 常用功能和工具集合
  5. android 1、Base64字符串转换成图片 2、二进制流转换为Bitmap图
  6. TransitionDrawable的简单替换图片
  7. android 读取本地图片生成 bitmap
  8. Android根据屏幕宽度,按比例缩放图片
  9. Android访问资源

随机推荐

  1. android ActionBar的使用
  2. android recent键值
  3. Android开发需要配置的环境
  4. Android如何获取屏幕分辨率的例子
  5. android pull dom解析xml
  6. Android(安卓)获取Web地址栏参数
  7. Android(安卓)登录对话框 实现
  8. android 全屏函数
  9. Android(安卓)activity的生命周期
  10. Android(安卓)使用Get方式实现断点下载(