位置: 编程技术 - 正文

解决android开发在大屏手机图片出现内存溢出(安卓开发常见问题解决)

编辑:rootadmin

推荐整理分享解决android开发在大屏手机图片出现内存溢出(安卓开发常见问题解决),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android开发现状,android开发难点,android开发模式,安卓开发问题,android开发难点,android开发过程遇到的问题,安卓开发常见问题解决,安卓开发遇到的问题和拟解决办法,内容如对您有帮助,希望把文章链接给更多的朋友!

说明这个问题,首先来看一下实际的内存占用情况。

我们创建一个最简单的android应用,一个Activity,内容是一张图片,图片放在drawable-hdpi目录下。布局文件:

<?xmlversion="1.0" encoding="utf-8"?>

<RelativeLayoutxmlns:android=" array(byte,boolean)栏中,内存占了8.5M,而最大一个对象占了4.M,应该就是图片。而实际上图片大小也就K。之所以大屏手机会出现这种情况,主要是因为我们把图片放在hdpi目录下,而大屏手机实际上是xhdpi甚至是xxhdpi。根据Android官方文档提供的资料:

By default, Android scales your bitmapdrawables (.png,.jpg, and.giffiles) and Nine-Patch drawables (.9.pngfiles) sothat they render at the appropriate physical size on each device. For example,if your application provides bitmap drawables only for the baseline, mediumscreen density (mdpi), then the systemscales them up when on ahigh-density screen, and scales them down when on a low-densityscreen.

Android会自动拉伸图片以适应当前手机的分辨率。因此导致了OOM内存溢出。

那么如果我们把hdpi的图片复制一份到xhdpi和xxhdpi中会怎样?

查看运行的结果:

在米1(小屏手机)上的内存占用情况:

而在大屏手机上显示的内存占用情况:

内存已经有所减少,特别是1-bytearray(byte[], boolean[])这一行。米1由于对应的是hdpi的图片,所以不受影响。

但是这样做也有问题,首先我们得把图片都拷贝到不同分辨率对应的目录下(最正确的做法是分别做一套对应分辨率的图片);其次图片占用内存的大小虽然已经减小,但还是太大。

再想一想,我们在布局文件里面写android:background和android:src这些属性,实际上解析之后执行的是view.setBackgroundResource和view.setImageResource方法,这两个方法实际上是拿到资源ID再去获取资源的drawable。他们会decode图片后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。

实际上我们可以用decodeStream来替代,因为decodeStream直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间.另外我们可以设置图片的参数,例如设置为Bitmap.Config.RGB_来减少内存开销。因为在android文档中描述Bitmap.Config.RGB_每一个像素存在2个字节中,而默认的Bitmap.Config.ARGB_每一个像素则需要4个字节,理论上足足节省了一半空间。

解决android开发在大屏手机图片出现内存溢出(安卓开发常见问题解决)

了解这些之后,我把布局文件中的android:background去掉,在java文件中来设置背景。

如下:

BitmapFactory.Options opt = newBitmapFactory.Options();

opt.inPreferredConfig = Bitmap.Config.RGB_;

opt.inPurgeable = true;

opt.inInputShareable = true;

//获取资源图片

InputStream is = context.getResources().openRawResource(resId);

Bitmap bitmap = BitmapFactory.decodeStream(is,null, opt);

is.close();

returnnew BitmapDrawable(context.getResources(),bitmap);

运行之后在来看效果:

在米1(小屏手机)上的内存占用情况:

而在大屏手机上显示的内存占用情况:

内存瞬间降下来,1-bytearray(byte[], boolean[])这一行最大&#;为K。

【Java同步块】 原文链接作者:JakobJenkov译者:李同杰Java同步块(synchronizedblock)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容:Java

批处理一键打包apk 经过了4-5个小时的激烈斗争终于把批处理整出来了,修改里面的链接地址,然后双击即可打包。批处理会自动替换两个common文件中的地址,并调用ant命

深入理解Android消息处理系统——Looper、Handler、Thread 深入理解Android消息处理系统——Looper、Handler、Thread熟悉Windows编程的朋友可能知道Windows程序是消息驱动的,并且有全局的消息循环系统。而Android应用程

标签: 安卓开发常见问题解决

本文链接地址:https://www.jiuchutong.com/biancheng/379647.html 转载请保留说明!

上一篇:android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项(android主流分辨率)

下一篇:【Java同步块】(java 同步方法和同步代码块区别)

  • 已申报税额是什么意思,要交吗
  • 小规模拍卖公司差额征税
  • 工程施工的借方和贷方
  • 开具了红字发票信息表的税额需要转出吗
  • 政府购买服务合同最多签几年
  • 同一控制下企业合并取得的长期股权投资
  • 作家以及作品
  • 普通增值税发票是否可以抵扣?
  • 未开票收入改为开票收入做账
  • 冲回多提所得税
  • 出口退税的企业范围
  • 开培训费专用发票开票有具体要求吗?
  • 什么情况下可以收取现金
  • 代缴水电费是什么意思
  • 批发企业购进商品发生的进货费用可以选择下列
  • 补发工资申请书格式范本
  • 发生工伤事故先怎么办
  • 发票两边的孔怎么做
  • 外派人员计算个人所得税可否有附加扣除
  • 持有至到期投资是什么意思
  • windows安全警报关不掉
  • 微信订阅项目
  • 凭证导致账簿错误
  • 会计编录怎么做
  • 预支员工报销费用会计科目
  • 房地产企业营改增是哪一年
  • 购买低值易耗品的现金流属于什么
  • 政府会计公共基础设施分类
  • 物业公司的会计科目有哪些
  • 个人所得税法实施细则2023
  • 现金流量表的填列方法
  • 房地产企业年报数据
  • 年底进项税额比年初多
  • 企业罚钱合理吗
  • 个税申报数据有误
  • sql查表结构语句
  • 抵扣的进项税如何做账
  • 监理公司成本核算方法
  • 以无形资产换入固定资产发生的净损益
  • 工程异地施工缴什么税
  • 销售自行开发的房地产项目的增值税
  • 预收账款借贷方向增减
  • 同一张发票报销两次会被发现吗
  • 应交税费进项税额转出是什么意思
  • 主营业务成本如何做分录
  • 税控系统维护费可以全额抵扣吗
  • 企业以前年度亏损未弥补完
  • 如何防止mysql数据库攻击
  • sql基础问题
  • windows 地址解析命令
  • win7玩游戏出现安全警报
  • Windows XP/Vista/Windows 7常见蓝屏故障分析
  • win10系统应用和浏览器控制需要启用吗
  • win102021年1月大更新
  • win10系统声音怎么打开
  • cocos2d-x window实现鼠标移动 键盘事件
  • unity best fit
  • 深入解析java编译器源码剖析与实例详解pdf百度云
  • jquery对动态生成的进行操作
  • android4.4w
  • div+css布局的步骤
  • jquery$符号
  • android图片透明度怎么设置
  • jQuery checkbox选中问题之prop与attr注意点分析
  • jquery技巧
  • android xui
  • Unity3D中Enabled、Destroy与Active的区别
  • unity减少drawcall
  • 老生常谈的近义词
  • 深入理解计算机系统
  • 可扩展的敏捷方法有哪两种观点,并作以简单阐述?
  • javascript面向对象编程指南 pdf
  • 广东省税务局电子发票怎么下载
  • 土地增值税清算条例与实施细则
  • 非涉密网络严禁什么
  • 消费税纳税申报流程图
  • 财税公司销售工作好做么
  • 百旺税控盘怎么清卡成功
  • 个人年收入超过多少不能退税
  • 家长进校园给孩子讲法律课
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设