Android面试Android中的性能优化
Posted Rose J
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android面试Android中的性能优化相关的知识,希望对你有一定的参考价值。
布局优化
首先我们在层级比较少的时候,可以优先使用constraintlayout,或者relativeLaout,减少布局的绘制。
页面比较简单的时候,可以使用LinearLayout或者FrameLayout,因为他们相对上述来说,布局的功能简单一些,所以花费的cpu时间会短一些
1. <include 标签
<include 标签可以将一个指定的布局加载到当前布局文件中,例如有一下重复的界面,就可以用include来实现
2.<merge 标签
<merge 标签 一般与<include 标签 配合使用以达到减少布局的层级,就比如布局文件的父布局已经是一个竖直方向的linearLayout,那么如果这个时候包含的布局也采用竖直方向的LinearLayout,那么显然这层LinearLayout是多余的,所以我们就可以通过<merge标签替代多余的那层LinearLayout
3. <ViewStub 标签
ViewStub继承了View,它非常轻量级且宽高都是0,它本身不参与任何的布局和绘制的过程。
ViewStub的意义在于按需加载所需的布局文件,有很多布局在正常情况下不会显示,比如网络异常的界面,网络正常的时候就没有必要在整个页面初始化的时候将其加载进来,通过ViewStub就可以做到在使用的时候再加载,提高了程序初始化时的性能。
当ViewStub通过setVisibility或者inflate方法加载后,ViewStub就会被它内部的布局替换掉,这个时候ViewStub就不再是整个布局结构中的一部分了,另外,目前ViewStub还不支持<merge标签
绘制优化
绘制优化是指View的onDraw方法要避免执行大量的操作,这主要体现在两个方面。
1.onDraw中不要创建新的局部对象,这是因为onDraw可能会被频繁调用,这样就会在一瞬间产生大量的临时对象,这不仅占用了过多的内存,而且还会导致系统更加频繁gc,降低了执行效率
2.onDraw方法中不要做耗时的任务,也不能执行成千上万次的循环操作,尽管每次循环都和轻量级,但是大量的循环仍然十分抢占CPU的时间片,这会造成View的绘制的过程不流畅。
(按照Google官方给出的性能优化典范中的标准,View的绘制帧率保证60fps是最佳的,这就要求每帧的绘制时间不超过16ms(16ms =1000/60)虽然程序很难保证16ms这个时间,但是尽量降低onDraw方法中的复杂度总是切实有效的)
内存泄漏优化
内存泄漏优化分为两个方面:
1.在开发中避免写出有内存泄漏的代码
2.通过内存泄漏分析工具比如MAT找出潜在的内存泄漏继而解决
响应速度优化
避免在主线程进行耗时操作
线程优化
线程优化的思想是采用线程池,避免程序中存在大量的Thread,线程池可以重用内部的线程,从而避免了线程的创建和销毁所带来的的性能开销,同时线程池还能有效的控制线程池的最大并发数避免大量的线程因互相抢占系统资源从而导致阻塞现象的发生,因此在实际开发中,我们要尽量采用线程池,而不是每次都要创建一个Thread对象
一些性能优化建议
1.避免创建过多的对象
2.不要过多的使用枚举,枚举占用的内存空间要比整型大
3.常量使用 staic final来修饰
4.使用一些android特有的数据结构,比如SpareArray和pair等,他们都具有更好的性能
5.适当使用软引用和弱引用
6.采用内存缓存和磁盘缓存
7.尽量采用静态内部类,这样可以避免潜在的由于内部类导致的内存泄漏
以上是关于Android面试Android中的性能优化的主要内容,如果未能解决你的问题,请参考以下文章
Android面试-Android性能优化和内存优化APP启动速度一线大厂的实战案例解析