最近做程序中,需要用到一张大图。这张图片是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. github常用命令

    全局配置 git config --global user.name "lewiscutey"git config --global user.email "lewisc ...

  2. Postgres中postmaster代码解析(中)

    今天我们对postmaster的以下细节进行讨论: backend的启动和client的连接请求的认证 客户端取消查询时的处理 接受pg_ctl的shutdown请求进行shutdown处理 2.与前 ...

  3. Android编写点击TextView拨打电话

    在任何一个电商平台都会有点击了手机号码会拨打出一个电话 那么高如何实现这个功能,我们下来分析下原理 当我们点击了一个电话号码后,会弹出一个Dialog显示是否拨打次电话号码,点击确定拨打号码,点击取消 ...

  4. 本地缓存,Redis缓存,数据库DB查询(结合代码分析)

    问题背景 为什么要使用缓存?本地缓存/Redis缓存/数据库查询优先级? 一.为什么要使用缓存 原因:CPU的速度远远高于磁盘IO的速度问题:很多信息存在数据库当中的,每次查询数据库就是一次IO操作所 ...

  5. Delphi 7中的四种消息框

    Delphi中平常使用的消息框有四种形式,有ShowMessage.MessageDlg.Application.MessageBox.MessageBox.下面来深入了解下这四种形式的实现和使用.1 ...

  6. Java Native方法

    一. 什么是Native Method   简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非j ...

  7. C语言 分支与循环 递推思想 穷举 流程的转移控制

    条件语句 开关控制语句(SWITCH语句) 象坐电梯一样,break是按的楼层,不加break则会一直执行下去. 上面程序有细节BUG,边界测试输入-5,105时由于整除会得到错误的结果. 解决方法: ...

  8. 3.3 声明[[],]的数组, push_back() 和 back() 的区别

    声明一个 [[],] 的二维数组: vector < vector<int> > res(1, vector<int>()); 或者 vector<vecto ...

  9. Async分析

     1:android在新版本中不允许UI线程访问网络,但是如果需要访问网络又改怎么办呐?这里有很多解决方案,比如新开一个线程,在新线程中进行访问,然后访问数据,返回后可能会更新界面也可能不更新界面,这 ...

  10. ubuntu批量更改文件权限

    重装系统之后,把文件从windows分区拷到linux分区发现所有文件的权限全是777,在终端下看到所有文件的颜色都很刺眼,文件有很多,一个一个改不现实,所以写了一段python脚本批量更改文件权限. ...