在使用屬性動畫的時候,我們知道如果不在頁面結束的時候釋放掉動畫,就會引起內存泄露。
簡單的說就是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