补间动画和属性动画内存泄露分析

深度分析内存泄漏原因,使用MAT工具检测内存泄露和性能 造成内存泄漏原因: 场景一:静态变量导致的内存泄漏 例如:mainactivity中   private static context scontext;    @override     protected void oncreat(bundle savedinstancestate){     ............................................ 阅读详情

在使用属性动画的时候,我们知道如果不在页面结束的时候释放掉动画,就会引起内存泄露。
简单的说就是ValueAnimator在AnimationHandler注册自己的AnimationFrameCallback,AnimationFrameCallback接口的实现类就是ValueAnimator自己,ValueAnimator又持有view对象,view有持有activity对象,这样activity对象就是被引用的,所以无法被回收。这样就造成了内存泄露。
另外说明一下AnimationHandler是一个单例模式(基于andoird-26源码)

public static AnimationHandler getInstance() {
        if (sAnimatorHandler.get() == null) {
            sAnimatorHandler.set(new AnimationHandler());
        }
        return sAnimatorHandler.get();
    }

所以说并不是开启一个属性动画就多一个Handler。只是多一个AnimationFrameCallback对象。一个属性动画就开启一个线程的说法自然也是不对的。

那么依附在view上的补间动画会不会引起内存泄露呢。我们简单通过源码来解析一下。看一下Animation的startNow方法

 public void startNow() {
        setStartTime(AnimationUtils.currentAnimationTimeMillis());
    }
public void setStartTime(long startTimeMillis) {
        mStartTime = startTimeMillis;
        mStarted = mEnded = false;
        mCycleFlip = false;
        mRepeated = 0;
        mMore = true;
    }

或者看view的startAnimation等方法:

public void startAnimation(Animation animation) {
        animation.setStartTime(Animation.START_ON_FIRST_FRAME);
        setAnimation(animation);
        invalidateParentCaches();
        invalidate(true);
    }

总是并没去开启Handler或者去注册Callback只是记录了动画的开始时间,和初始化一些标志位通知页面重绘等。所以补间动画会随着view的回收而回收,没有内存泄露的风险。具体的补间动画实现原理大家可以继续探索。

这里补充一些补间动画的东西:
1其实的动画是产生在view的parentView里,通过修改view的canvas来实现动画效果,所以view的实际大小并没有改变。
2补间动画不依赖handler,没有callback,不涉及MQ。所以不会有内存泄露的可能。
3补间动画在view detach的时候会被置null,所以view detach后补间动画的效果就没有了。注意这个置空的操作发生在detach方法里,如果view本来就是detach的。去设置动画再显示到屏幕上,补间动画是可以显示的。
4RecyclerView是多级缓存的,在一级缓存时,view离开屏幕再回来,不会走onbind方法,所以如果在onbind里设置补间动画,你的动画可能在RecycleView上下挪动的是失去效果。解决方法,可以在view的attach方法里去设置动画的逻辑。
5补间动画效率比属性动画高。

哪里可以找到我:

我的Github: https://github.com/AndroidMsky

我的博客主页: http://blog.youkuaiyun.com/androidmsky

【速通版!语义通信基础与前沿学习计划】 🧠语义通信基础与前沿学习计划 阅读详情

相关推荐

PlutoSDR在matlab中的环境配置(包括驱动和硬件支持包)

双击下载到的驱动,除了点击接受协议和设置安装路径,其他只要点击下一步或者安装即可。登录或者注册你的账号,选择你的matlab版本(这里我的是2023b),点击下一步。设置安装路径,并选择我接受,点击下一步,即可安装完成,并在安装路径中得到。完成后,打开设备管理器,在端口和通用串行总线设备一栏,即可看见下图。点击进入,选择相应的系统安装包,这里我选择的Windows。可看到我们要安装的Pluto支持包,安装即可。右击桌面matlab,选择打开文件所在位置。右上角搜索pluto,选择并点击下一步。

weixin_53160338的博客 4867

Android 内存泄漏 - Animator的使用与释放

Animator 导致泄漏 在属性动画中如果定义为无限循环,如果在Activity中播放这类动画并且在其退出(生命周期结果前)未停止动画,造成内存泄漏。 举例说明 假设有如下无限循环动画: public class LeakActivity extends AppCompatActivity { private TextView textView; private...

riskychengallesgut的专栏 1万+

OpenHarmony实战开发-如何实现文件分布式同步编辑

在分布式文件场景中,分布式设备管理包含了分布式设备搜索、分布式设备列表弹窗、远端设备拉起三部分。首先在分布式组网内搜索设备,然后把设备展示到分布式设备列表弹窗中,最后根据用户的选择拉起远端设备。两台设备组网的分布式场景是工作中常常需要的。这样的分布式场景有助于加快工作效率,减少工作中的冗余,本例将为大家介绍如何实现上述功能。​ (2)订阅分布式数据变化:通过this.distributedObject.on(‘status’, this.statusCallback)监听分布式数据对象的变更。

2401_82546228的博客 753

5个Android开发中比较常见的内存泄漏问题及解决办法

在Android开发中,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢? 在Android程序开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了。 内存泄漏有什么影响呢?它是

赤耳A狼 796

拼多多/Temu反爬参数逆向踩坑记:从浏览器调试到补环境完整复盘

本文详细解析了拼多多/Temu反爬参数`anti_content`的逆向工程实战,从浏览器调试到补环境完整复盘。通过JavaScript逆向技术,拆解关键函数定位、反混淆算法还原及补环境技术应用,帮助开发者突破电商平台复杂反爬系统,提升数据采集效率。

weixin_33978722的博客 914

深度探索:非线性随机森林(Nonlinear Random Forest,NL-RF)原理及应用

非线性随机森林(NL-RF)旨在通过结合集成方法与高级技术来捕捉和建模数据中的非线性关系,从而改善传统随机森林在处理复杂非线性数据结构时的表现。

qq_51320133的博客 2067

Animator动画引起的内存泄漏分析

一、Animator 相关的问题 Animator 是做什么的? 有哪些实现类? Animator 的核心实现原理? Animator 为何会引起内存泄漏? 如何避免 Animator 引起的内存泄漏? 二、回答问题 1、Animator 是做什么的? 有哪些实现类? Animator 是安卓动画框架的基类,这个基类抽象出与动画功能相关的通用方法,如start()、end()、cancel()、pause()、resume()、addXXXListener() 等核心通用方法,但因为它是抽象基类,所以

晓游的专栏 2298

手把手教你学Simulink--基于火电发电系统的场景实例:燃煤发电机组的锅炉-汽轮机协调控制仿真

本文介绍了使用Simulink构建燃煤发电机组锅炉-汽轮机协调控制系统的仿真方法。系统包含锅炉子系统、汽轮机子系统和协调控制器三大模块,通过传递函数建模和PID控制策略实现协调控制。详细说明了从模型创建、子系统设置到控制器设计的完整流程,包括燃料供给、汽轮机模型和数据处理等关键环节。最后通过性能评估验证系统响应速度、参数稳定性和效率等指标。该仿真方法为火电系统控制策略设计和优化提供了有效工具。

MHD0815的博客 1153

安卓补间动画和属性动画的区别以及实践

介绍安卓补间动画和属性动画在App退入后台后,不一样的处理方式产生不一样的效果和原理

写好每一篇文章 632

基于STM32、HAL库的ATMXT1066TD触摸屏控制器驱动程序设计

0x11) // 0x11是ATMXT1066的家族ID。// 最多支持10点触摸。// 足够存储10点触摸数据。

corlin6688的博客 164

[Python图像处理] 十九.图像分割之基于K-Means聚类的区域分割

前面的文章讲解了图像锐化和边缘提取技术,该篇文章将开始围绕图像分割进行讲解。图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。 本篇文章主要讲解基于理论的图像分割方法,通过K-Means聚类算法实现图像分割或颜色分层处理。基础性文章,希望对你有所帮助。 1.K-Means原理 2.K-Means聚类分割灰度图像 3.K-Means聚类对比分割彩色图像

杨秀璋的专栏 4万+

属性动画引起的内存泄露

在使用ValueAnimator或者ObjectAnimator时(ObjectAnimator继承ValueAnimator),如果没有及时做cancel取消动画,就可能造成内存泄露。因为在cancel方法里,最后调用了endAnimation(); ,在endAnimation里,有个AnimationHandler的单例,会持有属性动画对象的引用,属性对象持有view的引用,view持有ac...

qq_36356379的博客 4369

YOLO + SubspaceAD:一张良品图,检出所有未知缺陷

当YOLO遇上子空间建模,工业质检正迎来从“见多识广”到“举一反三”的质变时刻。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 498

动画的实现原理分析

最近在准备面试,不经意间看到了动画,这里想对动画做一个比较全面与深入的分析,自己也加深一下印象。那么从最先的Questions开始:Android中动画分为哪几类?说说属性动画的实现原理view动画与属性动画之间的区别OOM与内存泄露问题activity与fragment动画插值器先定个基调:所谓的动画只是不同时刻不同的画面重叠在一起,随着时间的推移给人产生了一种画面在动的感觉,其实质是在不同的时...

weixin_34008784的博客 916

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android 内存泄露实战分析

前两天测试测出一个内存泄露问题,困扰了我好几天,毫无头绪,今天突然灵光一现,找到了问题原因,解决了内存泄露问题,解决方法很简单,但是总要的是问题分析过程,所以有比较把解决问题思路记录下来,以便后续分析类似问题有参考作用,一下进入正题。以上是性能测试同事测出的问题,红框的地方表示电话应用出现了三个泄露,遇到这种问题,咱们先拿到hprof问题,拿不到就找测试要或者自己跑对应的测试用例,测试方法也可以找测试要,拿到hprof文件后,使用android studio的profiler打开:已上片是我自己抓取的hpr

limeng的博客 2519

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

AlphaFold 蛋白质结构预测报错排查教程:5 步跑通不翻车

刚点下运行键,终端吐出一串 `RESOURCE_EXHAUSTED`?AlphaFold(蛋白质结构预测)的报错排查并不吓人,只要你会拆。这篇教程给你:30 秒读堆栈的方法、起飞前体检清单,以及从 OOM 到拿到 `ranked_0.pdb` 的最快降级路径。 ## 先学会"读"报错:30 秒定位法 🔍 本节的目标:把一屏堆栈拆成三个词——哪一行、哪个模块、什么资源。 堆栈再长,从**最底

gitblog_00166的博客 877

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android性能优化(一)内存泄露优化(静态变量、单例模式、属性动画)

内存泄露优化分为两个方面,一方面是在开发过程中避免写出有内存泄露的代码,另一方面是通过一些分析工具比如 MAT来找出潜在的内存泄露继而解决。 一、静态变量导致内存泄露。一般情况下静态变量引用了或者内部持有Activity导致Activity无法销毁会导致内存泄露。代码如下: 二、单例模式导致内存泄露 Android的单例模式在我们项目开发中经常会用到,不过使用的不恰当的话也会

IT界寿险规划师的博客 5750

记属性动画监听器--AnimatorListenerAdapter导致的内存泄露

在使用AS的Profiler进行内存分析时,发现打开关闭activity会导致内存增长,并且不会下降,Dump Java heap 发现出现内存泄露: 观察引用情况(勾选 Show nearest GC root only): jump tosource 发现是属性动画监听器出现内存泄露: alphaAnimator.addListener(new AnimatorListenerAdapter() { @Override public .

weixin_40774418的博客 918

android gone动画_Android动画深入分析

1 View动画(1)android动画分为view动画、帧动画和属性动画,属性动画是API 11(Android 3.0)的新特性,帧动画一般也认为是view动画。(2)AnimationSet的属性android:shareInterpolator表示集合中的动画是否共享同一个插值器,如果集合不指定插值器,那么子动画需要单独指定所需的插值器或者使用默认值。(3)自定义动画需要继承Animati...

weixin_39754831的博客 201

04.Android之动画问题

目录介绍 4.0.0.1 Android中有哪几种类型的动画,属性动画和补间动画有何区别?补间动画和属性动画常用的有哪些? 4.0.0.2 View动画为何不能真正改变View的位置?而属性动画为何可以?属性动画是如何改变View的属性? 4.0.0.3 补间动画是如何作用于view的,从源码角度分析以下?为何说补间动画没有改变View的属性? 4.0.0.6 属性动画插值器...

weixin_30621711的博客 88

Android内存泄露

Android内存泄露参考文章/书籍: Android开发艺术探索 http://www.jianshu.com/p/c49f778e7acf 最近在看Android开发艺术探索这本书,所以总结一下部分知识:1、静态变量导致的内存泄露问题内存泄露的原因: 非静态内部类会默认对外部类持有强引用; 外部类创建一个静态的内部类对象:ic 综上:外部类和内部类相互持有,导致静态实例ic会一直持有该Activ

一枚疯女纸 472

内存溢出、内存泄露和性能优化总结

内存溢出内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个Integer,但给它存了long才能存下的数,那就是内存溢出。内存泄露内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。memory leak会最

Chay_Chan的博客 1577

androd 内存泄露分析

内存泄露是在Android开发中尤其要重视的一个问题,对开发人员开说,这是一个很容易犯也很常见的错误。优化内存泄露的问题,主要从两方面着手,一是开发人员避免写出有内存泄露的代码,二是通过一些诸如MAT的内存分析工具来找出潜在的内存泄露并解决它。 其实平时遇到的最多的情况,就是对Activity或Context保持一个长生命周期的引用。下面主要来分析一下造成内存泄露的各种原因。

yuyuyuzhen的专栏 411

【Android性能优化】(一) Android内存泄露分析

注:转载请注明来自Nemo, http://blog.youkuaiyun.com/nemo__     一、Android Studio内存泄露查找方法1. 在Android Studio内,按Alt+6,跳转到Android Monitor编辑框。2. 关注Memory项内容,操作怀疑内存泄露的步骤。3. 点击Memory右边Initiate GC后,Dump Java Heap,会生成一个hprof

Nemo__的博客 1200

python 单例模式内存泄露_性能优化之内存泄露优化

内存泄露优化产生原因:在Android程序开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了。内存泄漏在开发过程中是一个需要重视的问题,但是由于内存泄漏对开发人员的经验和开发意识有较高的要求,因此这也是开发人员最容易发的错误之一。它的优化有两方面,一是在开发过程中尽量避免...

weixin_39955700的博客 244

Android中内存泄露的原因分析:

Android中内存泄露的原因分析: 有垃圾回收机制,为什么还会出现内存泄露: 了解GC回收的原理:            GC会选择一些它了解还存活的对象作为内存遍历的根节点(GC Roots),比方说thread stack中的变量,JNI中的全局变量,zygote中的对象(class loader加载)等,然后开始对heap进行遍历。到最后,部分没有直接或者间接引用到GC Root

一条咸鱼 3681
上一篇: Android的TextView划线样式中断的解决方案
下一篇: JAVA中String的底层解析
AndroidMsky
博客等级 码龄11年 270粉丝 45原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值