前言
对于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】,心愿可能共同进步,共勉!