Android性能的优化主要分为两点
1、布局优化
2、内存优化
布局优化
首先来看一下布局优化,系统在渲染UI的时候会消耗大量的资源,所以,对布局的优化就显得尤为重要
避免Overdraw
也就是避免过度的绘制,过度的绘制会浪费更多的资源,举个例子,Android系统会默认绘制Activity的背景,这时候我们再设置一个背景,这样默认的背景就属于过度绘制了,在『开发者工具』中有一个『调试GPU过度绘制』的选项,我们打开就可以通过颜色来判断过度绘制的次数
如图:
所以说我们尽可能的增大蓝色区域,减少红色区域
优化布局层级
在Android系统中,系统对View进行测量、布局、绘制的时候,都是通过对View树的遍历来进行的,所以说一个布局的层级太多,就会严重影响测量、布局、绘制的速度,所以要降低View树的高度,Google在文档中建议布局的层级不超过10层,所以还要避免嵌套没有用的布局
使用include标签
相信大家都会在项目的时候遇到toolbar,或者一个UI在多个界面使用的问题,遇到这种问题的时候我们一般都会用include(毕竟大神『第一行代码』教的好),这样就减少了代码冗余,而且还利于后期更改
使用ViewStub实现View的延时加载
ViewStub标签和View.GONE的方式差不多,但是ViewStub只会在显示的时候去渲染,而GONE在初始化的时候就已经渲染完毕了,所以相比来说ViewStub的效率更高。
下面来通过代码使用一下ViewStub
首先我们定义一个布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
这里面只放了一个TextView,然后我们在自己的布局中通过ViewStub来引用他
<Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ViewStub android:id="@+id/vs" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout="@layout/view_stub"/>
这里的逻辑是点击按钮然后出现ViewStub引用的布局(也就是我们上面写的那个布局文件)
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ViewStub vs = (ViewStub) findViewById(R.id.vs); View vsView = vs.inflate(); TextView tv = (TextView) vsView.findViewById(R.id.tv); tv.setText("hahaha"); } });
这里想要把ViewStub引用的布局显示出来有两种办法,一种是ViewStub.setVisibility();另一种就是ViewStub.inflate();这两种方法的区别就是inflate()能返回引用的布局,然后可以通过这个布局来找到里面的子View来进行操作
运行程序点击按钮,就可以看到TextView已经显示出来了,并且已经赋值『hahaha』
Hierarchy Viewer
这个工具可以显示我们的布局,但是只可以在模拟器和工厂的Demo机上用,不过Google的大神提供了一个开源的项目ViewServer,有兴趣的可以看一下。
这个就不过多阐述了,有兴趣的可以自行查看一下相关的资料
内存优化
我们都知道,最近Android的厂商就是在拼配置,其中我们最关注的就是内存几个G,但是Android手机有的内存很大,但是很卡,这是因为有的手机软件在手机内存低的情况下不能被杀死,也就是我们说的『防杀』
我们知道内存一般分为这几个部分
1、寄存器
2、栈
3、堆
4、静态存储区
5、常量池
其中寄存器运算速度最快,但是我们在程序里无法控制
栈里存放基本数据类型
堆里存放对象和数组,在堆中的一般由Java的GC还管理
静态存储区在固定的位置存放应用程序中运行时一直存在的数据,Java专门划分了一个区域来管理静态变量
常量池就是该类型所使用到的常量的集合
Bitmap的优化
我们都知道在Android中是造成OOM的最大威胁,因为它占用的内存特别多,所以我们应该:
1、使用适当分辨率大小的图片
由于Android在做适配的时候会对不同分辨率的文件夹下的图片来进行缩放适配,如果图片的分辨率与资源分辨率不匹配的话就会导致消耗更多的资源
2、使用缓存
一般有内存缓存和硬盘缓存
代码优化
1、对常量使用static
2、使用静态方法,静态方法比普通方法提高15%左右的访问速度
3、减少没有必要的成员变量,如果能定义成局部变量就最好定义成局部变量
4、减少不必要的对象
5、少用枚举、迭代器
6、对Cursor、Receiver、File等对象,要注意回收和取消注册
7、使用SurfaceView来代替View进行大量并且频繁的绘图操作
8、尽量使用视图缓存,不是每次都执行inflate()来解析视图
9、避免使用反射
10、使用RenderScript、OpenGL来进行非常复杂的绘图操作
总结
以上就是对Android性能优化的一些点,如果你用AndroidStudio的话,AndroidStudio提供了一个内存监视的工具,还是很好用的,如果你没用AndroidStudio,那么我建议你使用AndroidStudio~
另外优化也没有绝对的完美,每一次优化都是基于当前的环境来做的,要明白沟通是最好的优化,不盲从,不随便,三思而后行。希望这篇文章对大家开发Android能有所帮助。
本文向大家介绍iOS性能优化浅析,包括了iOS性能优化浅析的使用技巧和注意事项,需要的朋友参考一下 本文将从原理出发,解释卡顿发生的原理,然后会讲解项目中行之有效的几个优化点,最后会展望一下接下来将要尝试的方向。下面进入正题。 屏幕显示的原理 屏幕显示原理 我们知道,远古时代的CRT显示器的显示原理是用电子枪扫描荧光屏来发光。如上图所示,电子枪按照从左到右,然后从上到下的顺序扫描。当电子枪换到新的
本文向大家介绍浅析Mysql Join语法以及性能优化,包括了浅析Mysql Join语法以及性能优化的使用技巧和注意事项,需要的朋友参考一下 一.Join语法概述 join 用于多表中字段之间的联系,语法如下: table1:左表;table2:右表。 JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录。 LEFT JOIN(左连
本文向大家介绍MySQL性能优化之max_connections配置参数浅析,包括了MySQL性能优化之max_connections配置参数浅析的使用技巧和注意事项,需要的朋友参考一下 MySQL的max_connections参数用来设置最大连接(用户)数。每个连接MySQL的用户均算作一个连接,max_connections的默认值为100。本文将讲解此参数的详细作用与性能影响。 与max_
本文向大家介绍浅谈react性能优化的方法,包括了浅谈react性能优化的方法的使用技巧和注意事项,需要的朋友参考一下 React性能优化思路 软件的性能优化思路就像生活中去看病,大致是这样的: 使用工具来分析性能瓶颈(找病根) 尝试使用优化技巧解决这些问题(服药) 使用工具测试性能是否确实有提升(疗效确认) 初识react只是为了尽快完成项目,后期进行代码审查时候发现有很多地方需要优化,因此做了
本文向大家介绍浅谈React组件之性能优化,包括了浅谈React组件之性能优化的使用技巧和注意事项,需要的朋友参考一下 高德纳: "我们应该忘记忽略很小的性能优化,可以说97%的情况下,过早的优化是万恶之源,而我们应该关心对性能影响最关键的另外3%的代码。" 不要将性能优化的精力浪费在对整体性能提高不大的代码上,而对性能有关键影响的部分,优化并不嫌早。因为,对性能影响最关键的部分,往往涉及解决方案
本文向大家介绍浅谈优化Django ORM中的性能问题,包括了浅谈优化Django ORM中的性能问题的使用技巧和注意事项,需要的朋友参考一下 Django是个好工具,使用的很广泛。 在应用比较小的时候,会觉得它很快,但是随着应用复杂和壮大,就显得没那么高效了。当你了解所用的Web框架一些内部机制之后,才能写成比较高效的代码。 怎么查问题 Web系统是个挺复杂的玩意,有时候有点无从下手哈。可以采用
Android 应用性能优化系列 原文链接分别为 : https://www.youtube.com/playlist?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE https://www.udacity.com/course/ud825 译者 : 胡凯 Android性能优化典范 Android性能优化之渲染篇 Android性能优化之运算篇 Android性能
ANR ANR全称Application Not Responding,意思就是程序未响应。 出现场景 主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞。 主线程中存在耗时的计算 主线程中错误的操作,比如Thread.wait或者Thread.sleep等 Android系统会监控程序的响应状况,一旦出现下面两种情况,则弹出ANR对话框 应用在5秒内未响应用户的输入事件(如按键或者触摸