補間動畫和屬性動畫內存泄露分析

在使用屬性動畫的時候,我們知道如果不在頁面結束的時候釋放掉動畫,就會引起內存泄露。
簡單的說就是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的回收而回收,沒有內存泄露的風險。具體的補間動畫實現原理大家可以繼續探索。

哪裏可以找到我:

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

我的博客主頁: http://blog.csdn.net/androidmsky

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章