专栏首页yang0rangeAndroid性能优化概述

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 条评论
登录 后参与评论

相关文章

  • 内存溢出和内存泄露

    内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了...

    Demo_Yang
  • Android常见面试题

    onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()

    Demo_Yang
  • Activity的启动模式

    privatestaticStack mActivityStack;Activity的启动模式,不仅仅是我们面试的时候经常被问到的面试题目,也是我们日常开发当中...

    Demo_Yang
  • Presto内存调优及原理(基础篇)

    Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节。

    sundyxiong
  • Presto内存调优及原理(基础篇)

    Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节。Presto支持在线数据查询,包括Hive, Cassandra,...

    用户1263954
  • Android最佳性能实践(一)——合理管理内存

    有不少朋友都问过我,怎样才能写出高性能的应用程序,如何避免程序出现OOM,或者当程序内存占用过高的时候该怎么样去排查。确实,一个优秀的应用程序,不仅仅要功能完成...

    用户1158055
  • 你真的懂定义语句 "int a" 吗?

    在刚开始学习一门新的编程语言的时候,我们通常的套路就是学习很多数据类型,定义各种变量。但你知不知道,数据类型的本质含义究竟是什么呢?

    用户2617681
  • 分享Linux内存占用几个案例

    最近一台 CentOS 服务器,发现内存无端损失了许多,free 和 ps 统计的结果相差十几个G,非常奇怪,后来Google了许久才搞明白。

    YP小站
  • JVM的新生代、老年代、MinorGC、MajorGC

    原文链接:https://www.cnblogs.com/ygj0930/p/6522828.html

    微风-- 轻许--
  • FreeRTOS 内存 Heap管理

    FreeRtos 提供的几种 heap 管理在源码目录 Source/Portable/MemMang 下,选择哪种类型管理直接在编译时把原文件加入(比如在 m...

    orientlu

扫码关注云+社区

领取腾讯云代金券