内存优化(一),Android面试基础知识

String b[] = new String[color.length];//移动后的数组

for (int c = 0, size = color.length - 1; c < size; c++) {

b[c + 1] = color[c];

}

b[0] = color[color.length - 1];

color = b;

invalidate();

currentColor = (int) animation.getAnimatedValue();

}

}

});

valueAnimator.start();

}

}

利用Android Studio内置的Profiler工具查看内存使用情况:

img

可以看到内存产生抖动,并且随着程序的运行,内存一直在增加,选择一段时间分析内存中的对象:

img

可以看到内存中的有大量的Path对象和String对象,一般来说是有异常的,分析代码看看是否能避免这种情况。

可以在onDraw方法里进行优化,优化后的代码:

/**

  • 优化后的IOSStyleLoadingView

  • onDraw方法里不创建Path和Paint对象,不调用Color.parseColor创建String对象

*/

public class IOSStyleLoadingView extends View {

private final Context context;

private double radius;

private double insideRadius;

private float northwestXStart;

private float northwestYStart;

private float northXStart;

private float northYStart;

private float notheastXStart;

private float notheastYStart;

private float eastXStart;

private float eastYStart;

private float southeastXStart;

private float southeastYStart;

private float southXStart;

private float southYStart;

private float southwestXStart;

private float southwestYStart;

private float westXStart;

private float westYStart;

private float northwestXEnd;

private float northwestYEnd;

private float northXEnd;

private float northYEnd;

private float notheastXEnd;

private float notheastYEnd;

private float eastXEnd;

private float eastYEnd;

private float southeastXEnd;

private float southeastYEnd;

private float southXEnd;

private float southYEnd;

private float southwestXEnd;

private float southwestYEnd;

private float westXEnd;

private float westYEnd;

private int currentColor = 7;

String color[] = new String[]{

“#a5a5a5”,

“#b7b7b7”,

“#c0c0c0”,

“#c9c9c9”,

“#d2d2d2”,

“#dbdbdb”,

“#e4e4e4”,

“#e4e4e4”

};

int[] colors = new int[8];

public IOSStyleLoadingView(Context context) {

this(context, null, 0);

}

public IOSStyleLoadingView(Context context, AttributeSet attrs) {

this(context, null, 0);

}

/**

  • 提前在构造方法里调用Color.parseColor解析好数据,而不是在onDraw方法里频繁调用

  • @param context

  • @param attrs

  • @param defStyleAttr

*/

public IOSStyleLoadingView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

this.context = context;

radius = UIKits.dip2Px(context, 9);

insideRadius = UIKits.dip2Px(context, 5);

for (int i = 0; i < color.length; i++) {

colors[i] = Color.parseColor(color[i]);

}

paint.setAntiAlias(true);

paint.setStrokeWidth(UIKits.dip2Px(context, 2));

paint.setStyle(Paint.Style.STROKE);

paint.setStrokeCap(Paint.Cap.ROUND);

}

Path path = new Path();

Paint paint = new Paint();

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

path.reset();

paint.setColor(colors[(currentColor++) % 8]);

path.moveTo(northwestXStart, northwestYStart);

path.lineTo(northwestXEnd, northwestYEnd);

canvas.drawPath(path, paint);

path.reset();

paint.setColor(colors[(currentColor++) % 8]);

path.moveTo(northXStart, northYStart);

path.lineTo(northXEnd, northYEnd);

canvas.drawPath(path, paint);

path.reset();

paint.setColor(colors[(currentColor++) % 8]);

path.moveTo(notheastXStart, notheastYStart);

path.lineTo(notheastXEnd, notheastYEnd);

canvas.drawPath(path, paint);

path.reset();

paint.setColor(colors[(currentColor++) % 8]);

path.moveTo(eastXStart, eastYStart);

path.lineTo(eastXEnd, eastYEnd);

canvas.drawPath(path, paint);

path.reset();

paint.setColor(colors[(currentColor++) % 8]);

path.moveTo(southeastXStart, southeastYStart);

path.lineTo(southeastXEnd, southeastYEnd);

canvas.drawPath(path, paint);

path.reset();

paint.setColor(colors[(currentColor

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值