Android面试100问--性能优化

转载地址   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倍

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值