android: fix when animator cannot be released
This commit is contained in:
		| @@ -15,6 +15,7 @@ | ||||
|  */ | ||||
| package pub.doric; | ||||
|  | ||||
| import android.animation.Animator; | ||||
| import android.animation.AnimatorSet; | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| @@ -32,6 +33,7 @@ import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| import java.util.WeakHashMap; | ||||
| import java.util.concurrent.Callable; | ||||
|  | ||||
| import pub.doric.async.AsyncResult; | ||||
| @@ -62,6 +64,7 @@ public class DoricContext { | ||||
|     private IDoricDriver doricDriver; | ||||
|     private final Map<String, Map<String, ViewNode<?>>> mHeadNodes = new HashMap<>(); | ||||
|     private final DoricPerformanceProfile performanceProfile; | ||||
|     private final Map<String, Animator> animators = new HashMap<>(); | ||||
|  | ||||
|     public Collection<ViewNode<?>> allHeadNodes(String type) { | ||||
|         Map<String, ViewNode<?>> headNode = mHeadNodes.get(type); | ||||
| @@ -187,6 +190,10 @@ public class DoricContext { | ||||
|     } | ||||
|  | ||||
|     public void teardown() { | ||||
|         for (Animator animator : animators.values()) { | ||||
|             animator.cancel(); | ||||
|         } | ||||
|         animators.clear(); | ||||
|         callEntity(DoricConstant.DORIC_ENTITY_DESTROY).setCallback(new AsyncResult.Callback<JSDecoder>() { | ||||
|             @Override | ||||
|             public void onResult(JSDecoder result) { | ||||
| @@ -332,4 +339,16 @@ public class DoricContext { | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void putAnimator(String animatorId, Animator animator) { | ||||
|         animators.put(animatorId, animator); | ||||
|     } | ||||
|  | ||||
|     public Animator getAnimator(String animatorId) { | ||||
|         return animators.get(animatorId); | ||||
|     } | ||||
|  | ||||
|     public void removeAnimator(String animatorId) { | ||||
|         animators.remove(animatorId); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -80,7 +80,6 @@ public abstract class ViewNode<T extends View> extends DoricContextHolder { | ||||
|     protected ViewGroup.LayoutParams mLayoutParams; | ||||
|     private String mType; | ||||
|     protected JSObject mFlexConfig; | ||||
|     private final WeakHashMap<String, Animator> animators = new WeakHashMap<>(); | ||||
|  | ||||
|     public JSObject getFlexConfig() { | ||||
|         return mFlexConfig; | ||||
| @@ -942,18 +941,20 @@ public abstract class ViewNode<T extends View> extends DoricContextHolder { | ||||
|     public void doAnimation(JSValue value, final DoricPromise promise) { | ||||
|         Animator animator = parseAnimator(value); | ||||
|         if (animator != null) { | ||||
|             String animatorId = value.asObject().getProperty("id").asString().value(); | ||||
|             animators.put(animatorId, animator); | ||||
|             final String animatorId = value.asObject().getProperty("id").asString().value(); | ||||
|             getDoricContext().putAnimator(animatorId, animator); | ||||
|             animator.addListener(new AnimatorListenerAdapter() { | ||||
|                 @Override | ||||
|                 public void onAnimationCancel(Animator animation) { | ||||
|                     super.onAnimationCancel(animation); | ||||
|                     getDoricContext().removeAnimator(animatorId); | ||||
|                     promise.reject(new JavaValue("Animation cancelled")); | ||||
|                 } | ||||
|  | ||||
|                 @Override | ||||
|                 public void onAnimationEnd(Animator animation) { | ||||
|                     super.onAnimationEnd(animation); | ||||
|                     getDoricContext().removeAnimator(animatorId); | ||||
|                     JSONBuilder jsonBuilder = new JSONBuilder(); | ||||
|                     for (String key : animatedKeys) { | ||||
|                         jsonBuilder.put(key, getAnimatedValue(key)); | ||||
| @@ -967,7 +968,7 @@ public abstract class ViewNode<T extends View> extends DoricContextHolder { | ||||
|  | ||||
|     @DoricMethod | ||||
|     public void clearAnimation(String id, final DoricPromise promise) { | ||||
|         Animator animator = animators.get(id); | ||||
|         Animator animator = getDoricContext().getAnimator(id); | ||||
|         if (animator != null) { | ||||
|             animator.cancel(); | ||||
|         } | ||||
| @@ -976,7 +977,7 @@ public abstract class ViewNode<T extends View> extends DoricContextHolder { | ||||
|  | ||||
|     @DoricMethod | ||||
|     public void cancelAnimation(String id, final DoricPromise promise) { | ||||
|         Animator animator = animators.get(id); | ||||
|         Animator animator = getDoricContext().getAnimator(id); | ||||
|         if (animator != null) { | ||||
|             animator.cancel(); | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user