Android加载图片OOM错误解决方式
前几天做项目的时候,甲方要求是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错误解决方式的更多相关文章
- android 加载图片oom若干方案小结
本文根据网上提供的一些技术方案加上自己实际开发中遇到的情况小结. 众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视手机而定).一般我们可以通过获取当 ...
- Android之批量加载图片OOM问题解决方案
一.OOM问题出现的场景和原因 一个好的app总少不了精美的图片,所以Android开发中图片的加载总是避免不了的,而在加载图片过程中,如果处理不当则会出现OOM的问题.那么如何彻底解决这个问题呢?本 ...
- Android加载图片导致内存溢出(Out of Memory异常)
Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证) ...
- 图片--Android加载图片导致内存溢出(Out of Memory异常)
Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证) ...
- android 加载图片框架--Glide使用详解
一.简介 Glide,一个被google所推荐的图片加载库,作者是bumptech.这个库被广泛运用在google的开源项目中,包括2014年的google I/O大会上发布的官方app.(PS:众所 ...
- android 加载图片防止内存溢出
图片资源: private int fore[]; private int back[]; fore = new int[]{R.drawable.a0, R.drawable.a1, R.drawa ...
- Android加载图片的策略
实现图片缓存也不难,需要有相应的cache策略.这里我采用 内存-文件-网络 三层cache机制,其中内存缓存包括强引用缓存和软引用缓存(SoftReference),其实网络不算cache,这里姑且 ...
- Android加载大量图片内存溢出解决办法
当我们在做项目过程中,一遇到显示图片时,就要考虑图片的大小,所占内存的大小,原因就是Android分配给Bitmap的大小只有8M,试想想我们用手机拍照,普通的一张照片不也得1M以上,所以androi ...
- 解决android加载图片时内存溢出问题
尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过jav ...
随机推荐
- 字符串匹配之horspool算法(简化的BM算法)
前面介绍在BF,KMP这些算法的时候老是提到BM这个东西,究竟这什么东西,有啥高深的,这些问题我们如今不去考虑.不知道,认真读前几篇文章的读者有没有发现前面的算法都是从模式串的前面開始匹配的,那我们就 ...
- OpenMp 基本
OpenMp是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多线程程序设计的一套指导性的编译处理方案(Compiler Di ...
- CocoaPods的一些理解
在这片博客中,我将分享我从cocopods中学到的东西. 如果你使用Cocoapods,你的.gitignore文件中会有什么. 这个问题在debate on SO中被提及,但是我建议只追踪Podfi ...
- css布局详解(二)——标准流布局(Nomal flow)
css标准流布局(Nomal flow) 一.正常流 这是指西方语言中文本从左向右,从上向下显示,这也是我们熟悉的传统的HTML文档中的文本布局.注意,在非西方的语言中,流方向可能不同.大多数元素都在 ...
- KindEditor放在包含模版页的页面里不显示解决方案
由于用了母版页,内容页服务器控件(是服务器控件哦)的id会被重写,我这里运行中查看源代码,控件的id变成了“ContentPlaceHolder1_content1”. <asp:TextBox ...
- (转)简易WCF负载均衡方案
最近跟高老师讨论nginx跟tomcat集群做负载均衡方案.感觉很有意思.想到自己项目中服务用的WCF技术,于是就想WCF如何做负载均衡,Google了一会,发现wcf4.0的路由服务好像可以实现.不 ...
- java二维不定长数组测试
package foxe; import javax.swing.JEditorPane;import javax.swing.JFrame; /** * @author fooxe * * @see ...
- C#拖动自己的定义标题栏(panel)以及实现窗体拖动关闭和最小化
//没有标题 this.FormBorderStyle = FormBorderStyle.None; //任务栏不显示 this.ShowInTaskbar = false; //实现拖动 1.在窗 ...
- js字符串数字计算
1.字符串转换为数字用 -0 var a=1; var b='2'; var c= a+b;(12) var c=a+(b-0);(3)
- lnmp 60秒的服务器缓存时间
1.问题 php代码写好之后执行发现居然没有生效,打断点,改代码.刷新都没有达到预期的效果.但是间隔60秒之后刷新就看到效果了,或者删除文件就里面见效. 2.原因 从phpinfo()页面输出搜索&q ...