am cc48c144: Merge "Make animators more robust against ending mid-stream" into jb-mr1-dev

* commit 'cc48c144bb0c15e003d1b9469c87a2c132ea6308':
  Make animators more robust against ending mid-stream
This commit is contained in:
Chet Haase
2012-08-16 15:38:30 -07:00
committed by Android Git Automerger

View File

@@ -536,6 +536,9 @@ public class ValueAnimator extends Animator {
// The per-thread list of all active animations
private final ArrayList<ValueAnimator> mAnimations = new ArrayList<ValueAnimator>();
// Used in doAnimationFrame() to avoid concurrent modifications of mAnimations
private final ArrayList<ValueAnimator> mTmpAnimations = new ArrayList<ValueAnimator>();
// The per-thread set of animations to be started on the next animation frame
private final ArrayList<ValueAnimator> mPendingAnimations = new ArrayList<ValueAnimator>();
@@ -605,28 +608,18 @@ public class ValueAnimator extends Animator {
// Now process all active animations. The return value from animationFrame()
// tells the handler whether it should now be ended
int numAnims = mAnimations.size();
int i = 0;
while (i < numAnims) {
ValueAnimator anim = mAnimations.get(i);
if (anim.doAnimationFrame(frameTime)) {
for (int i = 0; i < numAnims; ++i) {
mTmpAnimations.add(mAnimations.get(i));
}
for (int i = 0; i < numAnims; ++i) {
ValueAnimator anim = mTmpAnimations.get(i);
if (mAnimations.contains(anim) && anim.doAnimationFrame(frameTime)) {
mEndingAnims.add(anim);
}
if (mAnimations.size() == numAnims) {
++i;
} else {
// An animation might be canceled or ended by client code
// during the animation frame. Check to see if this happened by
// seeing whether the current index is the same as it was before
// calling animationFrame(). Another approach would be to copy
// animations to a temporary list and process that list instead,
// but that entails garbage and processing overhead that would
// be nice to avoid.
--numAnims;
mEndingAnims.remove(anim);
}
}
mTmpAnimations.clear();
if (mEndingAnims.size() > 0) {
for (i = 0; i < mEndingAnims.size(); ++i) {
for (int i = 0; i < mEndingAnims.size(); ++i) {
mEndingAnims.get(i).endAnimation(this);
}
mEndingAnims.clear();