Android性能优化概述

对于Android的性能优化,想必大家并不陌生,但是没有真正的总结一下,在此我根据自己平时开发,在结合一些读书笔记,对Android的性能优化,进行一些总结。 Android设备作为一种移动设备,不管是内存还是CPU的性能都受到了一定的限制,无法做到像PC设备那样的超大内存和高性能的CPU。 因此,这也意味着,Android不能无限制的使用内存和CPU资源,过多的使用内存会导致程序内存溢出,即OOM。而过多的使用CPU资源,一般是指大量的耗时任务,会导致手机变得卡顿甚至无法响应的情况,即ANR。性能优化的主要是包括布局优化、绘制优化、内存泄露优化、响应速度优化、Bitmap优化、线程优化。 性能优化中一个很重要的问题就是内存泄露,内存泄露并不会导致程序功能异常,但是它会导致Android程序的内存占用过大,这将提高内存溢出的发生几率。在设计程序的时候,还有一个问题也是不可忽略的,那就是代码的可维护性和可扩展性。如果一个程序的可维护性和可扩展性很差,那就意味着后续的代码维护代价是相当高的。

布局优化

优化布局就是尽量减少布局文件的层级,布局中的层级减少了,这就意味着Android绘制时的工作量减少了。 首先删除布局中的无用的控件和层级,其次有选择地使用性能较低的ViewGroup。如果布局中既可以使用LinearLayout也可以使用RelativeLayout,那么采用LinearLayout,这是因为RelativeLayout的功能比较复杂,它的布局过程需要花费更多的CPU时间。

采用标签

<include>标签

这个标签用于布局的重用,可以将一个指定的布局文件加载到当前的布局文件

<merge>标签

由于当前布局是一个竖直方向的LinearLayout,这个时候如果被包含的布局文件中也是采用了竖直方向的LinearLayout,那么被包含的布局文件当中的LinearLayout是多余的,通过<merge>标签就可以去掉多余的那一次LinearLayout。

ViewStub

ViewStub继承了View,它非常轻量级且宽高都是0,因此它本身不参与任何的布局和绘制过程。ViewStub的意义在于按需加载所需的布局文件,这样就是没有必要在整个界面初始化的时候将其加载进来,通过ViewStub就可以做到在使用的时候再加载。

绘制优化

内存泄露优化

内存泄露优化有两个方面,一方面是在开发过程中避免写出有内存泄露的代码,另一方面是通过一些分析工具找出潜在的内存泄露。

场景1:静态变量导致的内存泄露
场景2:单例模式导致的内存泄露

泄露的原因是Activity的对象被单例模式所持有,而单列模式的特点是其生命周期和Application保持一致,因此Activity对象无法被及时释放。

场景3:属性动画导致的内存泄露

属性动画有一类是无限循环的动画,如果在Activity中播放此类动画且没有在onDestory中去停止动画,那么动画会一直播放下去,尽管已经无法在界面上看到动画效果了,并且这个时候Activity的View会被动画持有,而View又持有了Activity,最终Activity无法释放。解决方法是在Activity的onDestory中调用animator.cancel()来停止动画。

Bitmap优化

主要是通过BitmapFactory.Options来根据需要对图片进行采样。

性能优化建议

避免创建过多的对象
不要过多使用枚举,枚举占用的内存空间要比整型大
常量请使用static final来修饰
适当会用软引用和弱引用
采用内存缓存和磁盘缓存
尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄露

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python学习之旅

python appium笔记(二):元素定位

#这里的示例是用android来说明的,xpath应该是通用的,resource-id不太清楚,没配过IOS的环境

27110
来自专栏君赏技术博客

百思不得姐数据挖掘第一篇

这是此文档的第一篇文章,写在之前要说的话。里面设计的技术点可能有些新人不是太了解,我只会说我遇到的难点和思路,文章也是想到那里写到那里。

7830
来自专栏林德熙的博客

win10 uwp 如何创建修改保存位图 创建保存图片在 Image 控件使用WriteableBitmap 转换通过读写像素转换 CanvasBitmap

在 UWP 使用底层的图像渲染就是使用 Softwarebitmap ,这个类提供直接数据修改,可以使用这个类进行软渲染。实际上 Softwarebitmap ...

44610
来自专栏北京马哥教育

Linux cat命令

豌豆贴心提醒,本文阅读时间3分钟,文末有秘密! ? 文 | 豌豆 图 | 来源网络 ? Linux cat命令 命令:cat cat 命令用...

41740
来自专栏游戏杂谈

【hta版】获取AppStore上架后的应用版本号

之前写过一篇文章:获取AppStore上架后的应用版本号,那一篇文章使用node.js实现,存在的问题就是如果在没有安装node.js运行环境下是无法运行的,而...

13720
来自专栏Flutter入门到实战

开发工具总结(1)之图文并茂全面总结上百个AS好用的插件(上)

俗话说得好,工欲善其事,必先利其器。做开发时间长了,总想找一些快捷方法,只有拥有好用的工具,才能节省开发时间,提高工作效率。我就是一个 追(喜)求(欢)高(偷)...

22810
来自专栏刘望舒

Android解析WindowManager(二)Window的属性

前言 在上一篇文章我们学习了WindowManager体系,了解了Window和WindowManager之间的关系,这一篇我们接着来学习Window的属性。 ...

24780
来自专栏Petrichor的专栏

nano:基本操作

27640
来自专栏CSDN技术头条

前端知识点总结——Vue

作用:将表达式执行的结果 输出当调用元素的 innerHTML 中;还可以将数据绑定到视图。

14420
来自专栏落影的专栏

iOS开发笔记(八)---- 键盘、静态库、动画、Crash定位

42790

扫码关注云+社区

领取腾讯云代金券