Android性能优化方案

前言

Android性能优化的方案比较多,在开发过程当中,主要考虑从如下几个方面优化面试

1.布局优化设计模式

2.绘制优化性能优化

3.内存泄漏优化微信

4.响应速度优化并发

5.Listview优化ide

6.Bitmap优化oop

7.线程优化布局

接下来咱们从这几个方面为你们简单介绍优化方案性能

1.布局优化

你们确定都知道Android中有许多布局,好比Linerlayout、RelativeLayout等,布局优化就是减小布局文件层级,层级减小了,那么程序绘制时就快了许多,因此能够提升性能。优化

在布局代码中,使用什么布局基本遵照如下规则:

1.若是布局中既可使用LinearLayout也可使用RelativeLayout,那么就采用LinearLayout,这是由于RelativeLayout的功能比较复杂,它的布局过程须要花费更多的CPU时间。

2.若是布局须要经过嵌套的方式来完成。这种状况下仍是建议采用RelativeLayout,由于ViewGroup的嵌套就至关于增长了布局的层级,一样会下降程序的性能。

3.使用<include>或<merge>标签和ViewStub,提取布局中公共部分的布局,可提升布局初始化效率。

2.绘制优化

绘制优化就是不要再view的onDraw方法中作大量操做。

第1、不要在onDraw方法中建立新的对象,由于onDraw方法可能被频繁调用,这样会产生大量的临时文件,致使内存占用过多,程序执行效率下降。

第2、尽量的不作耗时的操做,大数量的循环也会占用CPU的时间

3.内存泄漏优化

内存泄漏优化换句话说,就是什么状况可能会致使内存泄漏,相信你们都比较清楚,由于这也算是初级比较经典的面试题了。主要有如下几种状况:

1.不要再Acticity中声明静态变量,这样会是的Activity没法彻底销毁释放

2.单例设计模式一块儿的内存泄漏,单例设计模式的静态特性会使他的生命周期和应用程序的生命周期同样长,这就说明了若是一个对象不在使用了,而这时单例对象还在持有该对象的引用,这时GC就会没法回收该对象,形成了内存泄露的状况。因此使用单例模式时,传入的context应该使用ApplicationContext

3.非静态内部类建立的静态实例形成的内存泄漏

4.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回收,形成了内存泄漏。

4.响应速度优化

响应速度优化的核心思想是避免在主线程中作耗时操做,Android规定,Activity若是5秒钟以内没法响应屏幕触摸事件或者键盘输入事件就会出现ANR,而BroadcastReceiver若是10秒,Service时20s固然这是小几率事件,若是在相应时间内未获得反映就会出现ANR。当有耗时操做时,能够单独开启一个线程去操做。

5.listview优化

listview优化相信你们也都比较熟悉了,也是比较经典的面试题,在这里就不详细赘述了,主要有

复用view,首先判断view是否为空,若是不为空直接引用,为空再建立

使用ViewHolder类,settag的方式保存布局的控件初始化信息,避免每次都去findviewbyid影响效率

6.Bitmap优化

其实思想也很简单,那就是采用BitmapFactory.Options来加载所需尺寸的图片。这里假设经过ImageView来显示图片,不少时候ImageView并无图片的原始尺寸那么大,这个时候把整个图片加载进来后再设给imageView,这显然是不必的,由于ImageView并无办法显示原始的图片。经过BitmapFactory.Options就能够按必定的采样率来加载缩小后的图片,将缩小后的图片在ImageView中显示,这样就会下降内存占用从而在必定程度上避免OOM,提升了Bitmap加载时的性能。

7.线程优化

线程优化的思想是采用线程池,避免程序中存在大量的Thread。线程池能够重用内部的线程,从而避免了线程的建立和销毁所带来的性能开销,同时线程池还能有效地控制线程池的最大并发数,避免大量的线程因互相抢占系统资源从而致使阻塞现象的发生。所以在实际开发中,咱们要尽可能采用线程池,而不是每次都要建立一个Thread对象。

欢迎关注技术公众号,微信号搜索ColorfulCode 代码男人

分享技术文章,投稿分享,不限技术种类,不限技术深度,让更多人由于分享而受益。