IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 内存优化(三),真香系列 -> 正文阅读

[移动开发]内存优化(三),真香系列

private float westXStart = 250;

private float westYStart = 300;

private float westXEnd = 150;

private float westYEnd = 300;

String colorStr[] = new String[]{

“#ffff00”,

“#ff3300”,

“#ccff00”,

“#ff00cc”,

“#ccffff”,

“#cc99ff”,

“#99ff66”,

“#993300”

};

private ValueAnimator valueAnimator;

private int currentColor = 0;

public IOSStyleLoadingView(Context context, AttributeSet attrs) {

super(context, attrs);

this.mContext = context;

this.mStrokeWidth = UIUtils.dp2px(this.mContext, 5);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

Sample test1=new Sample(“测试1”);

Paint paint = new Paint();

paint.setAntiAlias(true);

paint.setStrokeWidth(this.mStrokeWidth);

paint.setStyle(Paint.Style.STROKE);

paint.setStrokeCap(Paint.Cap.ROUND);

Path p0 = new Path();

paint.setColor(Color.parseColor(colorStr[0]));

p0.mo

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

veTo(northwestXStart, northwestYStart);

p0.lineTo(northwestXEnd, northwestYEnd);

canvas.drawPath(p0, paint);

Path p1 = new Path();

paint.setColor(Color.parseColor(colorStr[1]));

p1.moveTo(northXStart, northYStart);

p1.lineTo(northXEnd, northYEnd);

canvas.drawPath(p1, paint);

Path p2 = new Path();

paint.setColor(Color.parseColor(colorStr[2]));

p2.moveTo(notheastXStart, notheastYStart);

p2.lineTo(notheastXEnd, notheastYEnd);

canvas.drawPath(p2, paint);

Path p3 = new Path();

paint.setColor(Color.parseColor(colorStr[3]));

p3.moveTo(eastXStart, eastYStart);

p3.lineTo(eastXEnd, eastYEnd);

canvas.drawPath(p3, paint);

Path p4 = new Path();

paint.setColor(Color.parseColor(colorStr[4]));

p4.moveTo(southeastXStart, southeastYStart);

p4.lineTo(southeastXEnd, southeastYEnd);

canvas.drawPath(p4, paint);

Path p5 = new Path();

paint.setColor(Color.parseColor(colorStr[5]));

p5.moveTo(southXStart, southYStart);

p5.lineTo(southXEnd, southYEnd);

canvas.drawPath(p5, paint);

Path p6 = new Path();

paint.setColor(Color.parseColor(colorStr[6]));

p6.moveTo(southwestXStart, southwestYStart);

p6.lineTo(southwestXEnd, southwestYEnd);

canvas.drawPath(p6, paint);

Path p7 = new Path();

paint.setColor(Color.parseColor(colorStr[7]));

p7.moveTo(westXStart, westYStart);

p7.lineTo(westXEnd, westYEnd);

canvas.drawPath(p7, paint);

}

@Override

protected void onAttachedToWindow() {

super.onAttachedToWindow();

startAnimation();

}

public void startAnimation() {

valueAnimator = ValueAnimator.ofInt(7, 0);

valueAnimator.setDuration(400);

valueAnimator.setRepeatCount(ValueAnimator.INFINITE);

valueAnimator.setInterpolator(new LinearInterpolator());

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

if ((int) animation.getAnimatedValue() != currentColor){

String b[] = new String[colorStr.length];

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

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

}

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

colorStr = b;

invalidate();

currentColor = (int) animation.getAnimatedValue();

}

}

});

valueAnimator.start();

}

}

img

内存分配

这是一个看起来相对平滑的内存走势图,但是也能看出内存一直在增加,不知道为什么我的内存分配Allocations一直为0,希望看到的小伙伴留言解答一下。

上面的代码有三个问题:

1、不断创建String对象,如下代码

paint.setColor(Color.parseColor(color[0]));

点击进去看源码:

public static int parseColor(@Size(min=1) String colorString) {

if (colorString.charAt(0) == ‘#’) {

// Use a long to avoid rollovers on #ffXXXXXX

// 这里调用了String类的substring方法

long color = Long.parseLong(colorString.substring(1), 16);

if (colorString.length() == 7) {

// Set the alpha value

color |= 0x00000000ff000000;

} else if (colorString.length() != 9) {

throw new IllegalArgumentException(“Unknown color”);

}

return (int)color;

} else {

Integer color = sColorNameMap.get(colorString.toLowerCase(Locale.ROOT));

if (color != null) {

return color;

}

}

throw new IllegalArgumentException(“Unknown color”);

}

原来这里调用了String类的substring方法,我们都知道String类是不可变类,每一个字符串对应一个String对象,每次调用substring方法截取字符串就要新建一个String对象来接收截取后的值,所以我们选中的String对象就来自这里。

代码修改如下:

int[] colorInt = new int[colorStr.length];

// 构造方法中初始化

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

colorInt[i] = Color.parseColor(colorStr[i]);

}

2、不能再onDraw中创建对象

Path mPath = new Path();

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

// 把Paint、Path的创建移出去

mPath.reset();

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

mPath.moveTo(northwestXStart, northwestYStart);

mPath.lineTo(northwestXEnd, northwestYEnd);

canvas.drawPath(mPath, paint);

}

3、属性动画的addUpdateListener监听中不断创建数组

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

if ((int) animation.getAnimatedValue() != currentColor){

// 记录每次回调的int值,去改变颜色的角标

currentColor = (int) animation.getAnimatedValue();

invalidate();

}

}

});

通过修改,内存非常稳定,没有了大量对象的创建。那我们来看一下是否有内存泄漏的问题呢?

使用Profiler工具dump一下,查看内存分配的具体信息,在使用MAT工具查看明细。

img

查看Activity是否有强引用

可以看到我们刚刚的自定义菊花Activity退出后一直存在强引用,造成内存泄漏。Activity的Context一直被自定义控件持有,再往上看IOSStyleLoadingViewIOSStyleLoadingView$1内部类持有。

img

引用关系

注意:

动画一直要记得停止

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-28 23:02:56  更:2021-12-28 23:04:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:28:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码