@SuppressLint("DrawAllocation")作用和解决方法

来源:互联网 发布:达内linux 编辑:程序博客网 时间:2024/05/22 14:41

    在Android自定义控件中,经常会遇到这样的一些警告(如下图),这些警告如果不去处理的话,并不会影响我们程序的正常运行,但是总有强迫症的人看了会觉得很不爽,比如我就是其中一个。

这里写图片描述

这里写图片描述

    其实,既然程序会报出这样的警告,肯定就会有他的不合理之处,只是并不会导致程序发生错误无法运行,我们写的代码平时也不多,所以一般对我们的程序不会有多大的影响,但是他会影响整个程序的安全性及一些其他性能,所以我们还是尽量去避免这写不合理之处。

    警告原因:

    首先,我们从警告的提示来看,Avoid object allocations during draw/layout operations (preallocate and reuse instead),意为避免在绘制/布局中去实例化对象。这样警告就很明显了,为什么会这样呢?

    因为在View及其子类的onDraw(Canvas canvas)方法,会实时调用以更新界面,会频繁的创建对象和进行垃圾回收等,这明显就会影响UI的显示性能,这样一个显示很顺畅的用户界面就会因对象分配引起的一些垃圾回收机制进行短暂的停滞。

    解决方法

    具体的解决方法也很简单,我们只需要将创建对象等这些分配内存资源和会引起垃圾回收机制的操作在之前进行,例如设置为全局变量,提取一个init()方法来实例化对象等,这样就会解决这些问题了。

    例如:

public class MyView extends View {    /**     * 声明画笔     */    private Paint mPaint;    public MyView(Context context) {        super(context);    }    public MyView(Context context, AttributeSet attrs) {        super(context, attrs);        // 初始化        init();    }    public MyView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);    }    /**     * 初始化     */    private void init() {        mPaint = new Paint();           mPaint.setAntiAlias(true);        mPaint.setStrokeWidth(1);        mPaint.setColor(Color.BLUE);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        canvas.drawRect(0, 0, 100, 100, mPaint);    }}

    PS: 这些小问题看似影响不大,但是时间久了,或者累积多了,就会使程序性能下降,甚至导致程序奔溃,尽量去避免他们。

2 0