最近做程序中,需要用到一张大图。这张图片是2880*2180大小的,在我开发所用的华为3C手机上显示没有问题,但是给米3装的时候,一打开马上报OOM错误。给nexus5装,则是图片无法出来,DDMS中打印堆溢出异常。于是开始看这个问题。

到stackvoerflow.com上找答案,发现一种很简单又巧妙的解决方法,就是新建一个drawable-nodpi的文件夹,然后把图片放在里面。对于其中的原因是,Android对于不同屏幕大小的手机,由于会去自动缩放图片以适应屏幕,所以会占用2倍的内存大小。而放在nodpi中,是为了让android系统不去缩放它。

另外一种方法就是设置options.inPreferredConfig了,共有4种配置,分别是RGB_565, ALPHA_8, ARGB_4444, ARGB_8888。代码如下:

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.road, options);

对于这4种配置,我在把图片放在hdpi和放在nodpi分别测试了它们的占用内存情况,数据如下:

把图片放在drawable-hdpi中,分别占用的内存:

05-20 15:07:19.197  32625-32625/cn.irains.parkinglay_by.app D/ParkingBitmapFragment﹕ RGB_565:22118400
05-20 15:07:19.916  32625-32625/cn.irains.parkinglay_by.app D/ParkingBitmapFragment﹕ ALPHA_8:44236800
05-20 15:07:20.976  32625-32625/cn.irains.parkinglay_by.app D/ParkingBitmapFragment﹕ ARGB_4444:22118400
05-20 15:07:21.444  32625-32625/cn.irains.parkinglay_by.app D/ParkingBitmapFragment﹕ ARGB_8888:44236800

把图片放在drawable-nodpi中,分别占用的内存:

05-20 15:14:32.741      736-736/cn.irains.parkinglay_by.app D/ParkingBitmapFragment﹕ RGB_565:12441600
05-20 15:14:32.853      736-736/cn.irains.parkinglay_by.app D/ParkingBitmapFragment﹕ ALPHA_8:6220800
05-20 15:14:33.036      736-736/cn.irains.parkinglay_by.app D/ParkingBitmapFragment﹕ ARGB_4444:12441600
05-20 15:14:33.181      736-736/cn.irains.parkinglay_by.app D/ParkingBitmapFragment﹕ ARGB_8888:24883200

可以看到,在放在drawable-hdpi的情况下,ALPHA_8和ARGB_8888占用的是同样大小的内存,约42M。而用ARGB_4444和RGB_565则省下了一半的内存,约21MB。

而如果放在drawable-nodpi中,ARGB_8888少了近一半的内存,占用内存不到24M,RGB_565和ARGB_4444是一样的,共占用不到12MB,是使用ARGB_8888时的一半。ALPHA_8占用更少,不到6M。

另外,对于OOM问题,如果你的图片大小大过你所需要的大小的话,还可以进行缩放再显示。相关方法网上搜索Android OOM,能找到许多答案,这里不再赘述。

解决android 大图OOM的两种方法的更多相关文章

  1. Android 抗锯齿的两种方法

    Android 抗锯齿的两种方法 (其一:paint.setAntiAlias(ture);paint.setBitmapFilter(true))   在Android中,目前,我知道有两种出现锯齿 ...

  2. android emulator启动的两种方法详解

    android emulator启动的两种方法详解    转https://blog.csdn.net/TTS_Kevin/article/details/7452237 对于android学习者,模 ...

  3. android使用全局变量的两种方法

         在我们使用android编写程序的时候,少不了想利用全局变量,但是面向对象语言和过程语言区别很大,不再是include就可以的.这里我写了使用全局变量的两种方法: 1.使用applicati ...

  4. [转]android使用全局变量的两种方法

    本文转自:http://blog.csdn.net/feiyangxiaomi/article/details/9966215 在我们使用android编写程序的时候,少不了想利用全局变量,但是面向对 ...

  5. Android访问WebService的两种方法

    首先解释一下WebService:WebService是一种基于SOAP协议的远程调用标准.通过WebService可以将不同操作系统平台,不同语言.不同技术整合到一起.详细见:http://baik ...

  6. (转)Android创建桌面快捷方式两种方法

    [IT168技术]Android在桌面上生成快捷方式有两种情况,一种是直接在桌面直接生成;一种是长按桌面,在弹出的快捷菜单中生成. 谈谈在桌面上直接生成.个人觉得这个比较爽快,既然都是快捷方式了干嘛还 ...

  7. Android apk签名的两种方法

    编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! 为了保证 ...

  8. android 实现分享功能两种方法

    当我想做一个智能的记事本的时候,我就在尝试自己写一组分享功能.后来才知道,原来每个社交软件中都有自己的分享接口. 这就大大减少了我们的代码量了. 第一种方法:特点--简单 package com.ex ...

  9. Android全屏的两种方法

    在开发中我们经常需要把我们的应用设置为全屏,这里我所知道的有俩中方法,一中是在代码中设置,另一种方法是在配置文件里改! 一.在代码中设置: [java] view plain copy package ...

随机推荐

  1. python3全栈开发-并发编程,多进程的基本操作

    一 .multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...

  2. 春招实习面经分享(已拿到腾讯春招Offer)

    十分幸运地收到了腾讯的Offer..回来报答一下各位牛客网的战友们,说起来也是有点运气成分,最后通过腾讯的内推收到了offer!之前也屡遭重创,阿里的内推一面挂了(寒假过早地投简历,电话面试应对地不太 ...

  3. spring基本原理

    作者:王奕然链接:https://www.zhihu.com/question/21346206/answer/101789659来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  4. js生成四位随机数的简便方法

    do out = Math.floor(Math.random()*10000); while( out < 1000 ) alert( out );

  5. monitoring with Prometheus

    Prometheus是一款开源的监控工具,支持k8s metrics的数据格式,同时也支持通过k8s api进行服务发现从而实现对自定义的metrics进行监控.下面通过一个示例来介绍如何将Prome ...

  6. 简介JSP与FreeMarker及Volicity区别

    FreeMarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个 ...

  7. CRM客户关系管理系统(二)

    第三章.前端页面设计  3.1.前端页面布局 Bootstrap模板下载 (1)静态文件 新建statics目录(存放css/fonts/imgs/js/plugins) settings配置 STA ...

  8. Create database 创建数据库

    首先在ORACLE用户下进入.bash_profile文件 [oracle@linux02 ~]$ vi .bash_profile export ORACLE_SID=hldbexport ORAC ...

  9. Docker配置文件

    Docker 的 Registry 利用配置文件提供了一些仓库的模板(flavor),用户可以直接使用它们来进行开发或生产部署. 模板 在 config_sample.yml 文件中,可以看到一些现成 ...

  10. Android RRO机制的运用-----google开机向导客制化

    上周五的时候领导分了一个任务,客户让在google开机向导里面增加一页,首先就想到了android的Overlay,然后网上搜了下,发下有很多人写了这方面的技术.而且写的都还不错,所以本篇只当记录作用 ...