前几天做项目的时候,甲方要求是PAD (SAMSUNG P600 10.1寸 2560*1600)的PAD上显示高分辨率的大图片。

SQLITE採用BOLD方式存储图片,这个存取过程就不说了哈,网上一大堆。

可是在加载/读取/显示图片的时候会报OOM错误,上网查了非常多解决方式还绕了非常多弯路,最后还是找到了原因所在。以下从几个方面来解释一下OOM问题的解决方式。

(谢谢周同学的“尺寸”提醒。不然我可能一辈子都要蒙在鼓里)

1.Android APP内存

做一个APP开发的时候,还是不要想着去扩大Android系统赋予的内存上限了。部分老机型老系统16M。大部分都是24M了。

一些大型游戏用dalvik.system.VMRuntime来干涉GC过程(这个类我还没有学过。

。刚听说不久)。

据说用NDK开发时候,C能够动态申请多余的内存空间,可是我没用过NDK,今后也不打算用了(个人原因)。

2.图片文件大小

甲方给了一大堆文件大小不一的图片,在加载数据库->读取出来->显示出来的这个过程中,出现了非常多OOM,分为:

a.加载图片时使用ByteArrayStream创建流,size为Height * Width * 4。OOM;

b.读取图片时候OOM,同上;

c.显示图片时候OOM,decodeResource函数报错,OOM;

開始时候以为是文件大小问题。后来发现有些2M的图片都能显示,可是某些1M的图片确报错。所以在一定范围内,能够证明。图片OOM问题与文件大小无关。

3.图片尺寸(分辨率)

调查这些能显示的图片和不能显示的图片的不同。发现长宽差距非常大。那些能成功显示的图片为1005*1500大小,而其它图片都是3000*5000以上。

我用PAINT(一款适合小白的图像处理软件。尽管不如PS可是功能已经很强大了,最新版须要安装NET 4.5)压缩了图片大小。压缩到1005*1500。显示成功。

4.函数调用

阅读了这位大神的博客:

http://blog.csdn.net/huangbiao86/article/details/8072128

摘取当中最精华的部分吧:

尽量不要使用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中配置对应的图片资源, 否则在不同分辨率机器上都是相同大小(像素点数量),显示出来的大小就不正确了。

看来读底层源代码还是非常实用的,setImageBitmap 和 setImageResource 和 decodeResource在运行过程中还是调用了createBitmap来创建一个新的bitmap。创建bitmap会加剧内存消耗,所以不推荐使用了。应该使用decodeStream方法。

图片的压缩过程也能够设置一个合适的百分比来控制大小。

多张图片的使用中,请注意流的flush与close(我没有及时flush和close的时候也执行正确了,这个有待研究一下,可是为了保证一个良好的习惯还是注意下吧)。

5.关于options方法

网上还有非常多文章用BitmapFactory.Options来作为decodeStream时候的一个參数,这个我临时没有详细实验过,哪位朋友实验过了能够回复交流哈

Android加载图片OOM错误解决方式的更多相关文章

  1. android 加载图片oom若干方案小结

    本文根据网上提供的一些技术方案加上自己实际开发中遇到的情况小结. 众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视手机而定).一般我们可以通过获取当 ...

  2. Android之批量加载图片OOM问题解决方案

    一.OOM问题出现的场景和原因 一个好的app总少不了精美的图片,所以Android开发中图片的加载总是避免不了的,而在加载图片过程中,如果处理不当则会出现OOM的问题.那么如何彻底解决这个问题呢?本 ...

  3. Android加载图片导致内存溢出(Out of Memory异常)

    Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory  Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证) ...

  4. 图片--Android加载图片导致内存溢出(Out of Memory异常)

    Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory  Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证) ...

  5. android 加载图片框架--Glide使用详解

    一.简介 Glide,一个被google所推荐的图片加载库,作者是bumptech.这个库被广泛运用在google的开源项目中,包括2014年的google I/O大会上发布的官方app.(PS:众所 ...

  6. android 加载图片防止内存溢出

    图片资源: private int fore[]; private int back[]; fore = new int[]{R.drawable.a0, R.drawable.a1, R.drawa ...

  7. Android加载图片的策略

    实现图片缓存也不难,需要有相应的cache策略.这里我采用 内存-文件-网络 三层cache机制,其中内存缓存包括强引用缓存和软引用缓存(SoftReference),其实网络不算cache,这里姑且 ...

  8. Android加载大量图片内存溢出解决办法

    当我们在做项目过程中,一遇到显示图片时,就要考虑图片的大小,所占内存的大小,原因就是Android分配给Bitmap的大小只有8M,试想想我们用手机拍照,普通的一张照片不也得1M以上,所以androi ...

  9. 解决android加载图片时内存溢出问题

    尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过jav ...

随机推荐

  1. 杭电 HDU ACM Milk

    Milk Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  2. mysql连接提示1030

    今天上午,开发使用工具连上mysql,连接一个库,就提示 mysql 错误 ERROR 1030 Got error 28 from. 查询资料,说可能是磁盘空间不足.果然连上去一看/分区空间只有数十 ...

  3. Sass函数--颜色函数--Opacity函数

    Opacity函数简介 在 CSS 中除了可以使用 rgba.hsla 和 transform 来控制颜色透明度之外,还可以使用 opacity 来控制,只不过前两者只是针对颜色上的透明通道做处理,而 ...

  4. HelloCharts pie饼图绘制

    先引用hellocharts-library-<version>.jar 然后在layout中设置 <lecho.lib.hellocharts.view.PieChartView ...

  5. pods的问题处理

    在使用pods添加的第三方删除的时候不能直接删除第三方,否则会出现

  6. Convert.ToInt32()和int.Parse()的区别

    (1)Convert.ToInt32(null)会返回0而不会报异常,但int.Parse(null)则会产生异常 (2)Convert.ToInt32("")和int.Parse ...

  7. No1_6.字符串的基本操作2_Java学习笔记

    import java.util.Scanner; import java.util.regex.Pattern; public class HelloString2 { public static ...

  8. Effective Java 电子书 apk版本下载

    下载安装包以后,安装即可阅读该书了,并且实时展示每章节代码哦,并且可以运行哦,赶快下载体验吧. Effective Java中文第二版下载地址:下载 应用截图:

  9. HTML5画布(矩形)

    canvas元素用于绘制图形. canvas元素是HTML5中新增的一个重要元素,元素本身是没有绘图能力,所有的绘制工作必须在javascript内部完成. 案例1: <!DOCTYPE htm ...

  10. 优化PHP代码的40条建议(转载)

    [size=5][color=Red](译文)优化PHP代码的40条建议[/color][/size] 40 Tips for optimizing your php Code 原文地址:http:/ ...