共计 2642 个字符,预计需要花费 7 分钟才能阅读完成。
前言
对于 Android 开发者来说,懂得根本的利用开发技能往往是不够,因为不论是工作还是面试,都须要开发者懂得大量的性能优化,这对晋升利用的体验是十分重要的。对于 Android 开发来说,性能优化次要围绕如下方面开展:启动优化、渲染优化、内存优化、网络优化、卡顿检测与优化、耗电优化、安装包体积优化、平安问题等。
上面是我整顿了网上很多大佬的教训分享对 Android 性能优化做了一个总结。
Android 性能优化的计划比拟多,在开发过程中,次要思考从以下几个方面优化:
- 布局优化
- 绘制优化
- 内存透露优化
- 响应速度优化
- Listview 优化
- Bitmap 优化
- 线程优化
接下来咱们从这几个方面为大家简略介绍优化计划。
布局优化
大家必定都晓得 Android 中有许多布局,比方 Linerlayout、RelativeLayout 等,布局优化就是缩小布局文件层级,层级缩小了,那么程序绘制时就快了许多,所以能够进步性能。
在布局代码中,应用什么布局根本恪守以下规定:
- 如果布局中既能够应用 LinearLayout 也能够应用 RelativeLayout,那么就采纳 LinearLayout,这是因为 RelativeLayout 的性能比较复杂,它的布局过程须要破费更多的 CPU 工夫。
- 如果布局须要通过嵌套的形式来实现。这种状况下还是倡议采纳 RelativeLayout,因为 ViewGroup 的嵌套就相当于减少了布局的层级,同样会升高程序的性能。
3. 应用 <include> 或 <merge> 标签和 ViewStub,提取布局中公共局部的布局,可进步布局初始化效率。
绘制优化
绘制优化就是不要再 view 的 onDraw 办法中做大量操作。
第一、不要在 onDraw 办法中创立新的对象,因为 onDraw 办法可能被频繁调用,这样会产生大量的临时文件,导致内存占用过多,程序执行效率升高。
第二、尽可能的不做耗时的操作,大数量的循环也会占用 CPU 的工夫
内存透露优化
内存透露优化换句话说,就是什么状况可能会导致内存透露,置信大家都比较清楚,因为这也算是高级比拟经典的面试题了。次要有以下几种状况:
- 不要再 Acticity 中申明动态变量,这样会是的 Activity 无奈齐全销毁开释
- 单例设计模式一起的内存透露,单例设计模式的动态个性会使他的生命周期和应用程序的生命周期一样长,这就阐明了如果一个对象不在应用了,而这时单例对象还在持有该对象的援用,这时 GC 就会无奈回收该对象,造成了内存泄露的状况。所以应用单例模式时,传入的 context 应该应用 ApplicationContext
- 非动态外部类创立的动态实例造成的内存透露
- Handler 造成的内存透露,不要在 Activity 中用非动态匿名外部类的形式去援用 hanlder,比方:
public class MainActivity extends AppCompatActivity {private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {}};
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadData();}
private void loadData(){Message message = Message.obtain();
mHandler.sendMessage(message);
}
}
这样 hanlder 会持有 Activity 的援用,handler 是运行在一个 Looper 线程中的,而 Looper 线程是轮询来解决音讯队列中的音讯的,假如咱们解决的音讯有 10 条,而当他执行到第 6 条的时候,用户退出销毁了以后的 Activity,这个时候音讯还没有解决完,handler 还在持有 Activity 的援用,这个时候就会导致无奈被 GC 回收,造成了内存透露。
响应速度优化
响应速度优化的核心思想是防止在主线程中做耗时操作,Android 规定,Activity 如果 5 秒钟之内无奈响应屏幕触摸事件或者键盘输入事件就会呈现 ANR,而 BroadcastReceiver 如果 10 秒,Service 时 20s 当然这是小概率事件,如果在相应工夫内未失去反映就会呈现 ANR。当有耗时操作时,能够独自开启一个线程去操作。
listview 优化
listview 优化置信大家也都比拟相熟了,也是比拟经典的面试题,在这里就不具体赘述了,次要有复用 view,首先判断 view 是否为空,如果不为空间接援用,为空再创立应用 ViewHolder 类,settag 的形式保留布局的控件初始化信息,防止每次都去 findviewbyid 影响效率
Bitmap 优化
其实思维也很简略,那就是采纳 BitmapFactory.Options 来加载所需尺寸的图片。这里假如通过 ImageView 来显示图片,很多时候 ImageView 并没有图片的原始尺寸那么大,这个时候把整个图片加载进来后再设给 imageView,这显然是没必要的,因为 ImageView 并没有方法显示原始的图片。通过 BitmapFactory.Options 就能够按肯定的采样率来加载放大后的图片,将放大后的图片在 ImageView 中显示,这样就会升高内存占用从而在肯定水平上防止 OOM,进步了 Bitmap 加载时的性能。
线程优化
线程优化的思维是采纳线程池,防止程序中存在大量的 Thread。线程池能够重用外部的线程,从而防止了线程的创立和销毁所带来的性能开销,同时线程池还能无效地控制线程池的最大并发数,防止大量的线程因相互抢占系统资源从而导致阻塞景象的产生。因而在理论开发中,咱们要尽量采纳线程池,而不是每次都要创立一个 Thread 对象。
Android 性能优化
实践方面
Android 的性能优化牵扯的知识点很多,除了下面讲过的这些罕用解决方案,底层原理也值得咱们深入探讨,此外还有性能监控还有工具的应用。
我依据本人的 Android 开发教训把这些性能优化的底层原理还有各种问题的解决方案和常识纲要都整顿成了材料。心愿能帮到你们。
…..
因为文章篇幅无限,文档资料内容较多,本能够提供链接下载,但无奈容易被谐和,所以全副存档,须要这些文档这里的敌人,能够点击我的【Gitee】, 心愿可能共同进步,共勉!