转载地址 https://blog.csdn.net/qq_23062979/article/details/81294713
我这里只是做一下笔记
-
布局优化
优化 1.0
1、如果父控件有颜色,也是自己需要的颜色,那么就不必在子控件加背景颜色
2、如果每个自控件的颜色不太一样,而且可以完全覆盖父控件,那么就不需要再父控件上加背景颜色
3、尽量减少不必要的嵌套
4、能用LinearLayout和FrameLayout,就不要用RelativeLayout,因为RelativeLayout控件相对比较复杂,测绘也想要耗时。
优化1.1
5、使用<include>和<merge> 增加复用,减少层级
6、<ViewStub>按需加载,更加轻便
优化1.2
7、复杂界面可选择ConstraintLayout,可有效减少层级
-
绘制优化
优化2.0
8、onDraw中不要创建新的局部对象
9、onDraw方法中不要做耗时的任务
-
内存优化
内存泄漏指的是那些程序不再使用的对象无法被GC识别,这样就导致这个对象一直留在内存当中
基本可以分为以下四大类:
1、集合类泄漏
2、单例/静态变量造成的内存泄漏
3、匿名内部类/非静态内部类
4、资源未关闭造成的内存泄漏
优化3.0
10、解决各个情况下的内存泄漏,注意平时代码的规范。
-
启动速度优化
优化4.0
11、利用提前展示出来的Window,快速展示出来一个界面,给用户快速反馈的体验;
12、避免在启动时做密集沉重的初始化(Heavy app initialization);
13、避免I/O操作、反序列化、网络操作、布局嵌套等。
-
包体优化
优化5.0
14、代码混淆。
15、插件化
16、资源优化
-
耗电优化
我们来谈一下怎么规避电老虎吧。
谷歌推荐使用JobScheduler,来调整任务优先级等策略来达到降低损耗的目的。
JobScheduler可以避免频繁的唤醒硬件模块,造成不必要的电量消耗。
避免在不合适的时间(例如低电量情况下、弱网络或者移动网络情况下的)执行过多的任务消耗电量;
具体功能:
1、可以推迟的非面向用户的任务(如定期数据库数据更新);
2、当充电时才希望执行的工作(如备份数据);
3、需要访问网络或 Wi-Fi 连接的任务(如向服务器拉取配置数据);
4、零散任务合并到一个批次去定期运行;
5、当设备空闲时启动某些任务;
6、只有当条件得到满足, 系统才会启动计划中的任务(充电、WIFI...);
同时谷歌针对耗电优化也提出了一个懒惰第一的法则
1、减少:你的应用程序可以删除冗余操作吗?例如,它是否可以缓存下载的数据而不是重复唤醒无线电以重新下载数据?
2、推迟:应用是否需要立即执行操作?例如,它可以等到设备充电才能将数据备份到云端吗?
3、合并:可以批处理工作,而不是多次将设备置于活动状态吗?例如,几十个应用程序是否真的有必要在不同时间打开收音机发送邮件?在一次唤醒收音机期间,是否可以传输消息?
谷歌在耗电优化这方面确实显得有些无力,希望以后可以退出更好的工具和解决方案,不然这方面的优化优先级还是很低。付出和回报所差太大。
so
优化6.0
17、使用JobScheduler调度任务
18、使用懒惰法则
-
ListView和 Bitmap优化
数据进行分段或者分页加载,
ListView ViewHolder重用原理 https://blog.csdn.net/u010687392/article/details/45620541
优化7.0
18、ListView使用ViewHolder,分段,分页加载
19、压缩Bitmap
-
响应速度优化
避免在主线程中做耗时操作,把耗时操作异步处理
-
线程使用优化
优点:
1、减少在创建和销毁线程上所花的时间以及系统资源的开销。
2、如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。
需要注意的是:
1、如果线程池中的数量为达到核心线程的数量,则直接会启动一个核心线程来执行任务。
2、如果线程池中的数量已经达到或超过核心线程的数量,则任务会被插入到任务队列中标等待执行。
3、如果(2)中的任务无法插入到任务队列中,由于任务队列已满,这时候如果线程数量未达到线程池规定最大值,则会启动一个非核心线程来执行任务。
4、如果(3)中线程数量已经达到线程池最大值,则会拒绝执行此任务,ThreadPoolExecutor会调用RejectedExecutionHandler的rejectedExecution方法通知调用者。
-
微优化
编写高效代码有两个基本规则:
1、不要做你不需要做的工作。
2、如果可以避免,请不要分配内存。
1、避免创建不必要的对象
对象创建永远不是免费的,虽然每一个的代价不是很大,但是总归是代价的不是吗?能不创建何必要浪费资源呢?
2、首选静态(这里说的是特定情景)
如果您不需要访问对象的字段,请使您的方法保持静态。调用速度将提高约15%-20%。这也是很好的做法,因为你可以从方法签名中看出,调用方法不能改变对象的状态
3、对常量使用static final
此优化仅适用于基本类型和String常量,而不适用于 任意引用类型。尽管如此,static final尽可能声明常量是一种好习惯。
4、使用增强的for循环语法
增强for循环(for-each)可用于实现Iterable接口和数组的集合。对于集合,分配一个迭代器来对hasNext()和进行接口调用next()。使用一个 ArrayList,手写计数循环快约3倍,但对于其他集合,增强的for循环语法将完全等效于显式迭代器用法。
5、避免使用浮点数
根据经验,浮点数比Android设备上的整数慢约2倍