1. 为什么需要性能优化?

上面说到,在时间窗口期内开发出产品是极端重要的,但是虽然基本功能我们实现了,但是开发出来的产品代码运行的效率怎么样呢?我们的App用户给用户的体验如何呢?

我们的App在低端机上经常ANR、闪退、卡顿等

我们的App在其他分辨率上显示惨不忍睹?

我们的App在不同网络的情况下如何处理的?

我们的App体验如此之差,导致大量的用户流失。这些迫使我们认识到性能优化是非常重要,某种程度上甚至超过了新功能的开发。

2性能优化四个方面:

- 响应时间(Response Time)

- 界面卡顿(ANR)

- 耗内存(Memory)

- 内存泄露(Out of memory)

响应时间

1)HTTP请求方式

这里指的是客户端与服务端交互,拿到数据、解析、再到显示到界面整个过程耗费的时间。

这个部分涉及客户端的优化,也涉及服务端的优化,这里只讨论客户端。

使用优秀的开源Http框架是我们比较好的选择,它的优点是经过市场的验证. 加快响应速度(网络请求框架)。

2)数据解析

实际开发当中服务端的返回数据格式无非就两种:

- JSON

- XML

在Android中均可以使用优秀的解析库来加快我们的解析速度,XML中有dom4j,JSON有Jackson、Gson,我们通过这些库实现我们更快的完成数据解析,提高我们的开发效率。

3)数据存储

为了提高应用程序的响应时间,数据缓存是一个比较好的方式,我们可以预处理服务器返回的数据,对数据进行缓存刷新。

优化点:

- 异步请求网络数据

- 预处理服务器返回数据

- 异步进行数据存储操作

数据缓存刷新

- Timeout超时重试

- 在主线程中操作UI

界面卡顿

ANR表示”应用程序无响应”,这个是需要我们避免发生的事情,出现这个异常的原因:

- 主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件

- BroadcastReceiver在10秒内没有执行完毕

导致ANR的原因有很多,一般情况就是在UI线程做了耗时的操作,例如”网络请求”、数据库操作。

那么如何避免?

UI线程只做界面刷新,不做任何耗时操作,耗时操作放在子线程来做

- 可以使用Thread+handle或者AsyncTask来进行逻辑处理

耗内存

每部手机的内存有限,我们这里所说的内存指的是手机的RAM,它是Ramdom Access Memory的缩写,我们应用程序的需要随机读写的数据就存在RAM中,Android手机之所以会比较耗内存,这跟Android后台的处理有关,我们知道Android应用是使用Java开发的,运行Java需要有虚拟机,说明每开启一个应用都会创建一个虚拟机,而这是需要内存的,所以我们开的应用越多,后台进程越多,内存都分配出去了,才导致内存消耗的严重。

随机存取存储器(random access memory,RAM)又称作"随机存储器",是与CPU直接交换数据的内部存储器,也叫主存(内存)。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。

其实这个问题我们是没得破的,只要内存不够,我们的应用还是会卡。我们开发的应用依赖与系统给我们分配的堆内存,一般上限在16M~48M,但我们可以通过在AndroidManifest设置Application属性largeHeap=“true”来申请更多的堆内存

可以通过代码获取可用堆内存限制

内存泄露

内存泄露这个问题已经被说烂了,大家都知道有内存泄露这个问题存在,但为什么会发生内存泄露?

这里的内存泄露并不是真正意思上的泄露,而是因为内存不足不能进行GC操作,从而导致占用内存过大,抛出out of memory异常,而被系统Kill掉。(内存泄露进而导致内存溢出)

3,如何进行性能优化?

前面讲了一些背景知识,对我们理解内存优化有一定的帮助,下面就简单说一下我们优化的方向:

- 布局优化

- 内存优化

布局优化

优化点:

- 避免OverDraw

- 优化布局层级

- 避免过多无用嵌套

- 使用标签 重用layout

- 使用延迟加载

- Hierarchy View进行层级分析

内存优化

内存优化的点有很多,这里我主要分为两大块:

- Bitmap优化

- 代码优化

代码优化

关于代码这个就有的说了,任何能改进我们程序的优化点都能写在这里,这里没办法把所有优化的点列在这里,只提供相关的参考,剩下的就好各位经验总结和积累了。

优化点:

- 对常量使用static修饰符

- 使用静态方法

减少不必要的成员变量

- 尽量不要使用枚举,少用迭代器

- 对Cursor、Receiver、Sensor、File等对象,要注意它们的创建、回收与注册、反注册

避免大量使用注解、反射

- 使用RenderScript、OpenGL来进行复杂的绘图操作

- 使用SurfaceView来替代View进行大量、频繁的绘图操作

- 尽量使用视图缓存,而不是每次都执行inflate()方法解析视图

创建新的对象都需要额外的内存空间,要尽量减少创建新的对象。 将类、变量、方法等等的可见性修改为最小。 针对字符串的拼接,使用StringBuffer替代String。 不要在循环当中声明临时变量,不要在循环中捕获异常。 如果对于线程安全没有要求,尽量使用线程不安全的集合对象。 使用集合对象,如果事先知道其大小,则可以在构造方法中设置初始大小。 文件读取操作需要使用缓存类,及时关闭文件。 慎用异常,使用异常会导致性能降低。 如果程序会频繁创建线程,则可以考虑使用线程池。

以上都是些经验总结,大致都相差无几,朋友们在做代码优化的时候,可以根据这些优化点,有针对性去重构代码,其实最重要还是代码的可读性,结构清晰。

性能优化工具

Memory Monitor - 内存监视工具 TraceView MAT

Android开发者对与以上几个性能调优的工具一定不陌生,这里我也不再写那么多废话了,关于它们的使用方法,官网还有一些大牛的博客都有介绍。

写这篇文章的出发点也是对Android性能优化有个比较清楚的认识,任何事情都不可能一蹴而就,需要循循渐进,对一个初学者你谈优化很不现实,我们先把基本的做好,再去考虑相应的优化,笔者也在不断学习当中,借鉴别人好的优化方案,提高产品的质量,感谢大家对笔者的关注。

性能优化技术,简而言之,就是提高我们程序的性能,让我们的应用更快,更少使用CPU资源,更少使用内存。

性能优化,一方面需要自身能力的提高,另外一方面,也需要有意识去学习优化技术,并应用于自身项目的开发中。

Android应用优化方案一相关推荐

  1. Android应用优化方案三

    Android应用优化方案一 点击进入 Android应用优化方案二 点击进入 Android应用优化方案三 布局优化 布局优化的思想很简单,尽量减少布局的层级,布局层级减少绘制时间就会跟着减少,从而 ...

  2. Android应用优化方案四

    Android应用优化方案一 点击进入 Android应用优化方案二 点击进入 Android应用优化方案三 点击进入 Android应用优化方案四 在Java中,内存的分配是由程序完成的,而内存的释 ...

  3. Android应用优化方案

    前言: 前面两篇文章主要是讲关于activity.fragment生命周期方面的总结,这篇文章主要是总结在android应用开发过程的优化方案,还有一些常用的优化工具.优化的方向包括:启动速度.界面流 ...

  4. android布局优化方案,Android启动优化-布局优化

    Android启动优化-布局优化 安卓应用开发发展到今天,已经成为一个非常成熟的技术方向,从目前的情况看,安卓开发还是一个热火朝天的发展,但高级人才却相对较少,如今移动互联网的开发者也逐渐开始注重插入 ...

  5. android 启动优化方案,Android 项目优化(五):应用启动优化

    介绍了前面的优化的方案后,这里我们在针对应用的启动优化做一下讲解和说明. 一.App启动概述 一个应用App的启动速度能够影响用户的首次体验,启动速度较慢(感官上)的应用可能导致用户再次开启App的意 ...

  6. 浅谈Android性能优化方案

    经过前一阶段的调查,大概对性能优化已经有了初步的解决方案: 先给大家介绍一下UC公司的性能优化指标以及部分方案: 一.性能优化六项指标: 性能.内存.稳定性.流量.电量.安装包大小: 二.背景 --- ...

  7. 史上最全Android性能优化方案解析

    Android中的性能优分为以下几个方面: 布局优化 网络优化 安装包优化 内存优化 卡顿优化 启动优化 -- 一.布局优化 布局优化的本质就是减少View的层级.常见的布局优化方案如下: 在Line ...

  8. Android启动优化方案调研

    /   今日科技快讯   / 7月21日,国家互联网信息办公室依据<网络安全法><数据安全法><个人信息保护法><行政处罚法>等法律法规,对滴滴全球股份 ...

  9. Android 性能优化之线程优化

    Android线程调度机制 线程调度模型 分时调度模型: 所有的线程轮流获得CPU使用权,平均分配每个线程占用的cpu时间 抢占式调度模型(Android):优先让可运行池中的优先级高的线程占用cpu ...

最新文章

  1. Network simulation using OPNET
  2. ASP.NET Core MVC 中的 [Controller] 和 [NonController]
  3. ubuntu系统下面PhantomJS not found on PATH
  4. centos7 网卡配置vlan_CentOS7网卡创建vlan步骤
  5. 基于C语言EOF与getchar()的使用详解
  6. php 对ioc容器的理解,关于php:了解IoC容器和依赖注入
  7. 谈谈MySQL InnoDB存储引擎事务的ACID特性
  8. c语言文件操作——复制文件
  9. 面试 AI 算法岗,你被要求复现顶会了嘛?
  10. Kotlin — 竞技程序设计(类似天梯训练)
  11. 实现虚拟机VMware上Centos操作系统与主机windows之间互相复制与粘贴
  12. 是否忘记了向源中添加 stdafx.h
  13. google chrome 同步书签 查看gmail邮箱 谷歌浏览器同步助手
  14. 黑客的google运用技巧
  15. win10系统一键安装教程
  16. 路由器、交换机的基本配置
  17. 国产32层堆栈3D闪存2019年量产 2020年赶超国际
  18. 【Reactome 下载所有通路基因集】
  19. 1. Java POI 读取、写入Excel(包括样式)的工具类Utils
  20. fanuc机器人DCS

热门文章

  1. 重庆云阳2021云中高考成绩查询,重庆云阳中学2021年排名
  2. docker mysql默认ip_Docker设置固定ip地址
  3. renderthread是什么_RenderThread学习笔记
  4. 史上最全的MonkeyRunner自动化测试从入门到精通(10)
  5. 使用指针数组+申请动态内存实现英文单词排序
  6. JavaScript关于pako.js压缩中文字符串
  7. 教务管理系统JavaWeb项目
  8. Win+数字 win7快捷键
  9. 优秀网页翻译:高精度 10MHz GPS 驯服钟 (GPSDO) - Part 2
  10. Ant Design Pro ProTable 自定义搜索菜单操作栏和搜索事件