oom解决方案

上传人:F****n 文档编号:90812300 上传时间:2019-06-19 格式:DOCX 页数:18 大小:31.24KB
返回 下载 相关 举报
oom解决方案_第1页
第1页 / 共18页
oom解决方案_第2页
第2页 / 共18页
oom解决方案_第3页
第3页 / 共18页
oom解决方案_第4页
第4页 / 共18页
oom解决方案_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《oom解决方案》由会员分享,可在线阅读,更多相关《oom解决方案(18页珍藏版)》请在金锄头文库上搜索。

1、oom解决方案篇一:android listview oom的一个解决方法android listview 加载大量高清图片不OOM方法首先声明,我不是大神是菜鸟。但是觉得还是写一下吧,因为oom太让人恼火了。网上很多大神提出了一些解决方案,软引用,缓存等等,确实一些方案挺好的,我在这里说的方案比较简单,对于菜鸟而言。但是,对于想写出好点儿的或者甚至是能用的程序的菜鸟而言,还是需要解决的啊。我遇到的问题就是listview加载高清大图,图大概720p左右的差不多宽度要全屏了。开始的时候,一打开程序就是占用内存四五十兆左右,加载几张图片就挂了,然后,折腾来折腾去,发现,之所以内存占用这么大,只是

2、因为我在登陆界面用了张1080p的壁纸!删掉之后吧背景换成shape,内存占用直接下降到13左右,太棒了。今天一下午折腾的。本来我用的是smartimageview这个开源视图组件,在adapter里面bitmap decode file,结果加载不了几张图,于是,后来,我用里面的setimageview(url),想着可能在里面做过缓存处理吧,然后看看里面他的实现,果然有,于是换成了url来设置imageview。好很多。最后做了个测试,200张图,分辨率都很高,很多720p左右(手机截图的),也有小的,还有几张手机相机照的1300万像素的照片,200张匀速下滑,看内存始终占用在48兆左右,

3、快速下滑一两下没事,连续快速下滑,还是oom,把largeheap开启之后,观察到连续快速下滑内存占用最高上升到125兆左右。当然,正常情况下,不允许这么操作的,待会儿把下拉改成自动下拉,下拉到尾部自动加载5张左右的图片,再结合服务器端的图片压缩,能把内存控制到三四十兆左右。之所以该服务器段,是因为现在能力差,把smartimageview改坏了也不好。上传图片的时候在服务器端压缩比较方便,同样也节省服务器空间。总结:注意以下几点:少用大的bitmap,用完要想办法处理,就象我用的登录页面的1080p图片直接占用几十兆。Smartimageview的从url设置头像挺好用的,里面实现了缓存,简

4、单看了一下,不过里面的实现用的软引用什么的,没有用推荐的lrucache来进行。我今年过年后才开始看的android教学视频,以前没有java基础,很多基本的东西不懂,就过年来了就直接开始写android了,压力很大。以上都是自己的见解,大神勿笑。篇二:Android之批量加载图片OOM问题解决方案Android之批量加载图片OOM问题解决方案一个好的app总少不了精美的图片,所以Android开发中图片的加载总是避免不了的,而在加载图片过程中,如果处理不当则会出现OOM的问题。那么如何彻底解决这个问题呢?本文将具体介绍这方面的知识。首先我们来总结一下,在加载图片过程中出现的OOM的场景无非就

5、这么几种:1、 加载的图片过大2、 一次加载的图片过多3、 以上两种情况兼有 那么为什么在以上场景下会出现OOM问题呢?实际上在API文档中有着明确的说明,出现OMM的主要原因有两点:1、移动设备会限制每个app所能够使用的内存,最小为16M,有的设备分配的会更多,如24、32M、64M等等不一,总之会有限制,不会让你无限制的使用。2、在andorid中图片加载到内存中是以位图的方式存储的,在之后默认情况下使用ARGB_8888,这种方式下每个像素要使用4各字节来存储。所以加载图片是会占用大量的内存。场景和原因我们都分析完了,下面我们来看看如何解决这些问题。首先先来解决大图加载的问题,一般在实

6、际应用中展示图片时,因屏幕尺寸及布局显示的原因,我们没有必要加载原始大图,只需要按照比例采样缩放即可。这样即节省内存又能保证图片不失真,具体实施步骤如下:这里需要用的BitmapFactory的decode系列方法和。当使用decode系列方法加载图片时,一定要将Options的inJustDecodeBounds属性设置为true。 options = new ;=true;public int calculateInSampleSize / Raw height and width of imagefinal int height = ;final int width = ;int inS

7、ampleSize = 1;if if inSampleSize = height / reqHeight); else inSampleSize = width / reqWidth); return inSampleSize;/计算图片的缩放比例 = calculateInSampleSize; = false; Bitmap bitmap= ;根据缩放比例,会比原始大图节省很多内存,效果图如下:下面我们看看如何批量加载大图,首先第一步还是我们上面所讲到的,要根据界面展示图片控件的大小来确定图片的缩放比例。在此我们使用gridview加载本地图片为例,具体步骤如下:private void

8、 loadPhotoPaths Cursor cursor=getContentResolver .query;whileString path =; ;Overridepublic View getView ViewHolder holder=null;ifconvertView = .inflate; holder = new ViewHolder ;= ;elseholder= ;final String path = ;);return convertView;通过以上关键两个步骤后,我们发现程序运行后,用户体验特别差,半天没有反应,很明显这是因为我们在主线程中加载大量的图片,这是不合

9、适的。在这里我们要将图片的加载工作放到子线程中进行,改造自定义的ImageLoader工具类,为其添加一个线程池对象,用来管理用于下载图片的子线程。private ExecutorService executor;private ImageLoader super ;executor = ;/加载图片的异步方法,含有回调监听public void loadImagefinal Handler mHandler = new Handler Overridepublic void handleMessage ;switch case 1:Bitmap bitmap = ;break;default

10、:break;putBitmapInMemey;Message msg = ; = bitmap;);通过改造后用户体验明显好多了,效果图如下:篇三:Android图片OOM处理和三级缓存我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如说系统图片库里展示的图片大都是用手机摄像头拍出来的,这些图片的分辨率会比我们手机屏幕的分辨率高得多。大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM异常。我们可以通过下面的代码看出每个应用程序最高可用内存是多少。in

11、t maxMemory = ;因此在展示高分辨率图片的时候,最好先将图片进行压缩。压缩后的图片大小应该和用来展示它的控件大小相近,在一个很小的ImageView上显示一张超大的图片不会带来任何视觉上的好处,但却会占用我们相当多宝贵的内存,而且在性能上还可能会带来负面影响。下面我们就来看一看,如何对一张大图片进行适当的压缩,让它能够以最佳大小显示的同时,还能防止OOM的出现。BitmapFactory这个类提供了多个解析方法用于创建Bitmap对象,我们应该根据图片的选择合适的方法。比如SD卡中的图片可以使用decodeFile方法,网络上的图片可以使用decodeStream方法,资源文件中的

12、图片可以使用decodeResource方法。这些方法会尝试为已经构建的bitmap分配内存,这时就会很容易导致OOM出现。、为此每一种解析方法都提供了一个可选的参数,将这个参数的inJustDecodeBounds属性设置为true就可以让解析方法禁止为bitmap分配内存,返回值也不再是一个Bitmap对象,而是null。虽然Bitmap是null了,但是的outWidth、outHeight和outMimeType属性都会被赋值。这个技巧让我们可以在加载图片之前就获取到图片的长宽值和MIME类型,从而根据情况对图片进行压缩。如下代码所示: options = new ; = true;i

13、nt imageHeight = ;int imageWidth = ;String imageType = ;为了避免OOM异常,最好在解析每张图片的时候都先检查一下图片的大小,除非你非常信任图片的,保证这些图片都不会超出你程序的可用内存。现在图片的大小已经知道了,我们就可以决定是把整张图片加载到内存中还是加载一个压缩版的图片到内存中。以下几个因素是我们需要考虑的:预估一下加载整张图片所需占用的内存。为了加载这一张图片你所愿意提供多少内存。用于展示这张图片的控件的实际大小。当前设备的屏幕尺寸和分辨率。1比如,你的ImageView只有128*96像素的大小,只是为了显示一张缩略图,这时候把一

14、张1024*768像素的图片完全加载到内存中显然是不值得的。那我们怎样才能对图片进行压缩呢?通过设置中inSampleSize的值就可以实现。比如我们有一张2048*1536像素的图片,将inSampleSize的值设置为4,就可以把这张图片压缩成512*384像素。原本加载这张图片需要占用13M的内存,压缩后就只需要占用了。下面的方法可以根据传入的宽和高,计算出合适的inSampleSize值:public static int calculateInSampleSize / 源图片的高度和宽度final int height = ;final int width = ;int inSampleSize = 1;if / 计算出实际宽高和目标宽高的比率final int heightRatio = height / reqHeight);final int widthRatio = width / reqWidth);/ 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高/ 一定都会大于等于目标的宽和高。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 事务文书

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号