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

 在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);
    }
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值