Android应用优化方案一
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应用优化方案一相关推荐
- Android应用优化方案三
Android应用优化方案一 点击进入 Android应用优化方案二 点击进入 Android应用优化方案三 布局优化 布局优化的思想很简单,尽量减少布局的层级,布局层级减少绘制时间就会跟着减少,从而 ...
- Android应用优化方案四
Android应用优化方案一 点击进入 Android应用优化方案二 点击进入 Android应用优化方案三 点击进入 Android应用优化方案四 在Java中,内存的分配是由程序完成的,而内存的释 ...
- Android应用优化方案
前言: 前面两篇文章主要是讲关于activity.fragment生命周期方面的总结,这篇文章主要是总结在android应用开发过程的优化方案,还有一些常用的优化工具.优化的方向包括:启动速度.界面流 ...
- android布局优化方案,Android启动优化-布局优化
Android启动优化-布局优化 安卓应用开发发展到今天,已经成为一个非常成熟的技术方向,从目前的情况看,安卓开发还是一个热火朝天的发展,但高级人才却相对较少,如今移动互联网的开发者也逐渐开始注重插入 ...
- android 启动优化方案,Android 项目优化(五):应用启动优化
介绍了前面的优化的方案后,这里我们在针对应用的启动优化做一下讲解和说明. 一.App启动概述 一个应用App的启动速度能够影响用户的首次体验,启动速度较慢(感官上)的应用可能导致用户再次开启App的意 ...
- 浅谈Android性能优化方案
经过前一阶段的调查,大概对性能优化已经有了初步的解决方案: 先给大家介绍一下UC公司的性能优化指标以及部分方案: 一.性能优化六项指标: 性能.内存.稳定性.流量.电量.安装包大小: 二.背景 --- ...
- 史上最全Android性能优化方案解析
Android中的性能优分为以下几个方面: 布局优化 网络优化 安装包优化 内存优化 卡顿优化 启动优化 -- 一.布局优化 布局优化的本质就是减少View的层级.常见的布局优化方案如下: 在Line ...
- Android启动优化方案调研
/ 今日科技快讯 / 7月21日,国家互联网信息办公室依据<网络安全法><数据安全法><个人信息保护法><行政处罚法>等法律法规,对滴滴全球股份 ...
- Android 性能优化之线程优化
Android线程调度机制 线程调度模型 分时调度模型: 所有的线程轮流获得CPU使用权,平均分配每个线程占用的cpu时间 抢占式调度模型(Android):优先让可运行池中的优先级高的线程占用cpu ...
最新文章
- Network simulation using OPNET
- ASP.NET Core MVC 中的 [Controller] 和 [NonController]
- ubuntu系统下面PhantomJS not found on PATH
- centos7 网卡配置vlan_CentOS7网卡创建vlan步骤
- 基于C语言EOF与getchar()的使用详解
- php 对ioc容器的理解,关于php:了解IoC容器和依赖注入
- 谈谈MySQL InnoDB存储引擎事务的ACID特性
- c语言文件操作——复制文件
- 面试 AI 算法岗,你被要求复现顶会了嘛?
- Kotlin — 竞技程序设计(类似天梯训练)
- 实现虚拟机VMware上Centos操作系统与主机windows之间互相复制与粘贴
- 是否忘记了向源中添加 stdafx.h
- google chrome 同步书签 查看gmail邮箱 谷歌浏览器同步助手
- 黑客的google运用技巧
- win10系统一键安装教程
- 路由器、交换机的基本配置
- 国产32层堆栈3D闪存2019年量产 2020年赶超国际
- 【Reactome 下载所有通路基因集】
- 1. Java POI 读取、写入Excel(包括样式)的工具类Utils
- fanuc机器人DCS
热门文章
- 重庆云阳2021云中高考成绩查询,重庆云阳中学2021年排名
- docker mysql默认ip_Docker设置固定ip地址
- renderthread是什么_RenderThread学习笔记
- 史上最全的MonkeyRunner自动化测试从入门到精通(10)
- 使用指针数组+申请动态内存实现英文单词排序
- JavaScript关于pako.js压缩中文字符串
- 教务管理系统JavaWeb项目
- Win+数字 win7快捷键
- 优秀网页翻译:高精度 10MHz GPS 驯服钟 (GPSDO) - Part 2
- Ant Design Pro ProTable 自定义搜索菜单操作栏和搜索事件