1. 程式人生 > >補間動畫和屬性動畫記憶體洩露分析

補間動畫和屬性動畫記憶體洩露分析

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

哪裡可以找到我: