解决android 大图OOM的两种方法
最近做程序中,需要用到一张大图。这张图片是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的两种方法的更多相关文章
- Android 抗锯齿的两种方法
Android 抗锯齿的两种方法 (其一:paint.setAntiAlias(ture);paint.setBitmapFilter(true)) 在Android中,目前,我知道有两种出现锯齿 ...
- android emulator启动的两种方法详解
android emulator启动的两种方法详解 转https://blog.csdn.net/TTS_Kevin/article/details/7452237 对于android学习者,模 ...
- android使用全局变量的两种方法
在我们使用android编写程序的时候,少不了想利用全局变量,但是面向对象语言和过程语言区别很大,不再是include就可以的.这里我写了使用全局变量的两种方法: 1.使用applicati ...
- [转]android使用全局变量的两种方法
本文转自:http://blog.csdn.net/feiyangxiaomi/article/details/9966215 在我们使用android编写程序的时候,少不了想利用全局变量,但是面向对 ...
- Android访问WebService的两种方法
首先解释一下WebService:WebService是一种基于SOAP协议的远程调用标准.通过WebService可以将不同操作系统平台,不同语言.不同技术整合到一起.详细见:http://baik ...
- (转)Android创建桌面快捷方式两种方法
[IT168技术]Android在桌面上生成快捷方式有两种情况,一种是直接在桌面直接生成;一种是长按桌面,在弹出的快捷菜单中生成. 谈谈在桌面上直接生成.个人觉得这个比较爽快,既然都是快捷方式了干嘛还 ...
- Android apk签名的两种方法
编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! 为了保证 ...
- android 实现分享功能两种方法
当我想做一个智能的记事本的时候,我就在尝试自己写一组分享功能.后来才知道,原来每个社交软件中都有自己的分享接口. 这就大大减少了我们的代码量了. 第一种方法:特点--简单 package com.ex ...
- Android全屏的两种方法
在开发中我们经常需要把我们的应用设置为全屏,这里我所知道的有俩中方法,一中是在代码中设置,另一种方法是在配置文件里改! 一.在代码中设置: [java] view plain copy package ...
随机推荐
- JavaScript实现简单的双向数据绑定
什么是双向数据绑定 双向数据绑定简单来说就是UI视图(View)与数据(Model)相互绑定在一起,当数据改变之后相应的UI视图也同步改变.反之,当UI视图改变之后相应的数据也同步改变. 双向数据绑定 ...
- Chinese-Text-Classification:Tensorflow CNN 模型实现的中文文本分类器[不分词版]
从现在的结果来看,分词的版本准确率稍微高一点. 训练过程: 模型评估: 实验三,准备换一下数据集,用这里的数据集来跑这个模型:https://zhuanlan.zhihu.com/p/30736422 ...
- java异常处理之throw, throws,try和catch
转自 http://blog.csdn.net/zhouyong80/article/details/1907799 程序运行过程中可能会出现异常情况,比如被0除.对负数计算平方根等,还有可能会出现 ...
- Weblogic Exception in AppMerge flows' progression
原因:经过分析是web.xml配置的问题,有些servlet上面配置了'display-name',这个weblogic是不支持的. 解决:在web.xml中把'display-name'删除掉,工程 ...
- C# 基础问答
1.静态变量和非静态变量的区别? 2.const 和 static readonly 区别? 3.extern 是什么意思? 4.abstract 是什么意思? 5.internal 修饰符起什么作用 ...
- OpenSuSE Linux下安装Oracle10g的步骤
OpenSuSE Linux下安装Oracle10g的步骤: --root用户 --1.vi etc/profile 添加脚本: if [ \$USER = "oracle" ]; ...
- Docker实例:创建一个点到点连接
默认情况下,Docker 会将所有容器连接到由 docker0 提供的虚拟子网中. 用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接. 解决办法很简单:创建一对 peer 接口,分别 ...
- 介绍Docker容器
容器是 Docker 又一核心概念. 简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境.对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用 ...
- spring-boot配置静态资源映射的坑:properties文件不能添加注释
如此博文所述,Spring Boot 对静态资源映射提供了默认配置 默认将 /** 所有访问映射到以下目录:classpath:/staticclasspath:/publicclasspath:/r ...
- [精简版]snowing snow
CSS <style> body { background: #eee; } @keyframes mysnow { 0% { bottom: 100%; opacity: 0; } 50 ...