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