Android性能优化2
Android中性能优化的问题。本篇文章是对前面部分的一个总结(读者可以翻看之前的文章),同时笔者结合了实际项目中的经验,希望能对大家抛砖引玉。
Android性能优化,也是面试中几乎必问的知识点。本文也将告诉你如何回答这样的问题。
实际项目中的Android性能优化主要有如下几个方面:
编写高效代码—开发中总结出的一些小的性能Tips
Layout布局优化
内存优化
编写高效代码
本节告诉你如何编写高效代码,并总结了一些小的性能优化点。
编写高效代码的两个原则
不要写不需要的代码
不要分配不必要的内存
以上两个原则,似乎感觉是废话,但确实是编程的最高境界,也是我们编写代码的过程中时刻需要思考和注意的两个方面。
那么如何做到如上两点呢?下面列出了一些实际开发中的小的例子。
1.避免产生不必要的对象
例如:
int的数组比Integer对象数组要好得多。两个平行的int数组要比一个(int,int)型的对象数组高效。这对于其他任何基本数据类型的组合都通用
两个平行数组Foo[],Bar[]会优于一个(Foo,Bar)对象的数组
通常来讲,尽量避免创建短时零时对象.少的对象创建意味着低频的垃圾回收
对象的分配和回收都是需要代价的;分配的内存越多,就会引起强制的内存回收;给用户体验增加小的停顿间隙,从而影响用户体验。
用户能感觉到卡顿的时间延迟是100ms ~ 200ms。
2.用静态代替虚拟
如果方法不需要访问某对像的字段,将该方法设置为静态,调用速度会提升15%~20%
对于常量使用 final static
final static int intVal = 42;
final static String strVal = "Hello world";
注:这种优化仅仅是针对基本数据类型和String类型常量的,而非任意的引用类型。但尽可能的将常量声明为static final是一种好的做法。
为什么尽量将将常量声明为static final是一种好的做法呢?这是因为:
当上面的代码块没有final修饰符时,编译器会生成一个类初始化方法,当该类初次被使用时执行,这个方法将42存入intVal中,并得到类文件字符串常量strVal的一个引用。当这些值在后面被引用时,他们通过字段查找进行访问。
声明为final字段后, 类不再需要方法,因为常量通过静态字段初始化器载进入dex文件中。引用intVal的代码,将直接调用整型值42;而访问strVal,也会采用相对开销较小的“字符串常量”指令替代字段查找。
本节讨论的是一些微小的性能提升,可能不会给你的程序性能改善产生显著的效果。决定程序整体性能的仍然取决于程序的业务逻辑设计、代码的数据结构和算法。但你需要将这些优化技巧应用到平时的编码过程中,积少成多,也会对性能有很大的影响
3.避免内部的getter和setter
4.使用增强for循环
对于ArrayList和数组,手写的计数循环迭代要比增强for循环快3倍
结论:优先采用改进for循环,但在性能要求苛刻的ArrayList迭代中,考虑采用手写计数循环。 (参见 Effective Java item 46.)
5.避免使用浮点数
通常的经验是,在Android设备中,浮点数会比整型慢两倍
6.在没有JIT的设备上,调用方法所传递的对象采用具体的类型而非接口类型会更高效
void methodA(List<String> list);
void methodA(ArrayList<String> list);
如上,后一种比前一种更高效。
7.数据库操作方法的优化
尽量利用原生的SQL语句
原生的SQL省去了拼接sql语句的步骤,要比SqliteDatabase提供的insert、query、 update、delete等函数效率高。当数据库越大,差别也越大
当操作条数较多时,利用事务进行批处理
这样SQLite将把全部要执行的SQL语句先缓存在内存当中,然后等到COMMIT的时候一次性的写入数据库,这样数据库文件只被打开关闭了一次,效率自然大大的提高
db.beginTransaction();
for(Collection c:colls){ insert(db, c); } db.setTransactionSuccessful();
8.Http请求方式的选择
Android 内置了两种HTTP方式:HttpURLConnection 和 Apache HttpClient。这两种都支持HTTPS、流式上传和下载、可配置超时、IPv6和连接池。在Gingerbread或者更高版本时,推荐使用HttpURLConnection。
这是因为: HttpURLConnection API 更简单,包更小。同时对传输数据的压缩和响应的缓存处理减少了网络带宽、提高了速度,也节省了电量。
优化布局
Layouts是Android应用里直接影响用户体验的一个关键部分。如果Layout设计的不好,可能导致你的应用大量的内存占用从而导致UI响应很慢。Android SDK提供了工具帮助你分析你的Layouts的性能问题。结合工具同时遵循本节讨论的做法,能实现滑动流畅、占用内存最小的用户界面。
使用Hierarchy Viewer
Hierarchy Viewer工具位于 < SDK >\tools\目录下 ,该工具能分析出你的布局不合理和可以优化的地方。具体用法参见之前文章的介绍例子。
大多数情况下,布局渲染时间差别较大的原因是在LinaerLayout里使用了layout_weight。这将会增加测量(Measure)的时间。你应该仔细的考虑是否有必要使用layout weight。
使用Lint
使用Lint — 查看你的view 层级哪些地方可以优化
使用compound drawables - 一个包含了ImageView与TextView的LinearLayout可以被当作一个compound drawable来处理
使用merge根框架 - 如果FramLayout仅仅是一个纯粹的(没有设置背景,间距等)布局根元素,我们可以使用merge标签来当作根标签
无用的分支 - 如果一个layout并没有任何子组件,那么可以被移除,这样可以提高效率
无用的父控件 - 如果一个layout只有子控件,没有兄弟控件,并且不是一个ScrollView或者根节点,而且没有设置背景,那么我们可以移除这个父控件,直接把子控件提升为父控件
深层次的layout - 尽量减少内嵌的层级,考虑使用更多平级的组件 RelativeLayout or GridLayout来提升布局性能,默认最大的深度是10
其他一些布局要点
Re-using Layouts with <include/>
Use the <merge>
Loading Views on Demand
<ViewStub
android:id="@+id/stub_import" android:inflatedId="@+id/panel_import"
android:layout="@layout/progress_overlay …. />
优化App内存
为了垃圾回收器能回收你系统的内存,你应该避免引起内存泄露(通常由全局成员hold了对象引用),而且要在合适的时间点(如生命周期回调时,这将在后面章节进一步讨论)释放被引用的对象。
慎用Service
Service执行完后台任务后要停止,注意:不要service任务已完成,而不去停止service
使用IntentService
IntentService不同于普通的Service之处是:
提交的task系统会post到子线程运行
当后台运行的task完成时,系统会stop掉IntentService
onHandleIntent(Intent intent)
当一个service不需要而还在后台运行时,这是最消耗内存的内存管理错误。因此要慎用服务,当服务完成后台任务时要记得关闭。如果不这样做,由于RAM的限制,你的app运行将变得非常卡,用户也将发现app错误的行为,最后卸载你的应用
Release memory when your user interface becomes hidden
例如,在该onStop()里做释放资源(例如网络连接、注销广播等)的工作
使用优化后的集合容器
例如:SparseArray、SparseBooleanArray、LongSpareArray …..
尽量避免使用枚举
相比于静态常量,枚举会有超过其两倍以上的内存开销,在android中需严格避免使用枚举
避免使用依赖注入框架
使用ProGuard消除没有使用的代码
使用zipalign优化和对齐你的apk
优化避免使用更多的内存、资源不会再从apk中映射入内存。
注:google play store不接受没有进行zipalign的apk
使用MAT分析和优化内存
I/O使用后需要关闭,数据库和Cursor等使用后要关闭
使用finalize()+MAT 分析内存泄露
Android优化主要就是内存、布局和性能的优化,本文概况和总结了Android中优化的一些知识点。其实,里面的很多的知识点都可以展开进行讲解。如果大家对里面某个方面感兴趣,可以给我们留言。后续的文章我们会进行专门的讨论。
Android性能优化2相关推荐
- Android 性能优化
为什么80%的码农都做不了架构师?>>> 原文作者:鸿洋 原文地址:点我跳转原文 一般情况下,我们谈性能优化基本上会从以下几个方面: App启动速度优化 UI流畅度优化 内存优 ...
- Android性能优化系列 + Android官方培训课程中文版
Android性能优化典范 - 第6季 http://hukai.me/android-performance-patterns-season-6/ Android性能优化典范 - 第5季 http: ...
- Android性能优化——腾讯、字节、阿里、百度、网易等互联网公司项目实战+案例分析(附PDF)
前言 当我们还在用按键.滑盖.翻盖手机的时候,全触屏手机来了; 当我们觉得二维码这项发明没有意义的时候,支付宝和微信等狠狠地给了我们响亮的耳光; 当我们以为扫码支付只有支付宝的时候,微信支付来了; 当 ...
- Android性能优化典范第二季
原文链接:http://hukai.me/android-performance-patterns-season-2/ 1)Battery Drain and Networking 对于手机程序,网络 ...
- Android性能优化之渲染篇(一)
前言 工作有半年多了,自己的技术没有很大的长进,平时也没有注意学习,只是完成了工作任务就可以了,这样下去的话,自己将很难有提高.面对现在激烈的竞争环境以及技术不断的更新,自己真的要去学习,不断的提高自 ...
- Android性能优化典范笔记(1)-GPU绘制性能优化
Android性能优化典范笔记(1)-GPU绘制性能优化 你还可以再Github上找到我的这篇文章:https://github.com/onlynight/ReadmeDemo/tree/maste ...
- Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)...
2019独角兽企业重金招聘Python工程师标准>>> 前言 在 Android开发中,性能优化策略十分重要 因为其决定了应用程序的开发质量:可用性.流畅性.稳定性等,是提高用户留存 ...
- Android性能优化
Android性能优化 一.布局优化: 1.优化方式: 减少不必要嵌套,尽可能使用LinearLayout.ConstraintLayout等控件 减少颜色覆盖,子控件背景足够,不要在其父控件加颜色 ...
- Android主线程耗时动画卡顿,Android性能优化实战之界面卡顿
原标题:Android性能优化实战之界面卡顿 作者:红橙Darren https://www.jianshu.com/p/18bb507d6e62 今天是个奇怪的日子,有三位同学找我,都是关于界面卡顿 ...
- 【Android 性能优化】布局渲染优化 ( CPU 渲染优化 | 减少布局的嵌套 | 测量布局绘制时间 | OnFrameMetricsAvailableListener | 布局渲染优化总结 )
文章目录 一. 减少布局嵌套 二. 布局渲染时间测量 1. FrameMetrics 使用流程 2. FrameMetrics 参数解析 3. FrameMetrics 代码示例 三. 布局渲染优化总 ...
最新文章
- 卸载后的mysql和navicat怎么清除干净_清除电脑“牛皮癣 ”,带你回归清爽体验~...
- linux日志中有空格,linux中统计排序的内容含有空白行的解决办法
- Flask项目支持https
- SCTF 2015 pwn试题分析
- UA OPTI570 量子力学10 位置表象与动量表象
- 25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验
- iphone同步助手_教你如何用爱思助手给你的苹果手机设置自己喜欢的铃声
- 通过BI专题场景,深度剖析制造行业如何提高设备利用率?
- 肾炎治疗有效方(湿热壅滞三焦,气机不利)
- 删除矩阵中的任意一列元素
- Oracle数据库php短连接,PHP 连接 Oracle
- 录音喊话器的故障修理_我司quot;XAHHQ1型quot;喊话器 通过公安部检测
- Vivaldi解决flash插件问题
- Macbook安装brew
- lsoci mysql_【MySQL】InnoDB日志机制深入分析
- 学习操作系统心得体会
- 四个免费好用的临时邮箱
- 低级程序员和高级程序员的区别,难道这就是最强王者的世界吗?
- 静态网页的广告banner部分
- 菜鸟落泪:debian 9 安装 python 库记录
热门文章
- 嵌入式Linux系统编程学习之二十八线程的等待退出
- java 文件中查找指定的单词,查找指定文本文件中的单词数的Java程序
- hdu3094 A tree game
- C++网易云课堂开发工程师--转换函数
- 企业级Ngnix基于域名的配置_server
- [BZOJ1635][Usaco2007 Jan]Tallest Cow 最高的牛
- Java复习第三天-静态方法
- net2.0中使用Cookie保存中文出现乱码的解决方法
- Javascript中的一些小知识收集
- Axure实现提示文本单击显示后自动消失的效果