diff --git a/ReactAndroid/src/main/java/com/facebook/react/animated/BUCK b/ReactAndroid/src/main/java/com/facebook/react/animated/BUCK index af3a76e0cec5a9..ac827a56ee1b05 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/animated/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/animated/BUCK @@ -6,10 +6,12 @@ android_library( '*.java', ]), deps = [ + react_native_dep('libraries/fbcore/src/main/java/com/facebook/common/logging:logging'), react_native_dep('third-party/android/support/v4:lib-support-v4'), react_native_dep('third-party/java/infer-annotations:infer-annotations'), react_native_dep('third-party/java/jsr-305:jsr-305'), react_native_target('java/com/facebook/react/bridge:bridge'), + react_native_target('java/com/facebook/react/common:common'), react_native_target('java/com/facebook/react/module/annotations:annotations'), react_native_target('java/com/facebook/react/modules/core:core'), react_native_target('java/com/facebook/react/uimanager/annotations:annotations'), diff --git a/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java b/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java index 95d90549b5f118..0e53f59ef6e7c7 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java @@ -12,6 +12,7 @@ import android.util.SparseArray; import com.facebook.infer.annotation.Assertions; +import com.facebook.common.logging.FLog; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.JSApplicationIllegalArgumentException; @@ -19,6 +20,8 @@ import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.bridge.WritableMap; +import com.facebook.react.common.ReactConstants; +import com.facebook.react.uimanager.IllegalViewOperationException; import com.facebook.react.uimanager.UIImplementation; import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.uimanager.events.Event; @@ -446,7 +449,17 @@ public void runUpdates(long frameTimeNanos) { nextNode.update(); if (nextNode instanceof PropsAnimatedNode) { // Send property updates to native view manager - ((PropsAnimatedNode) nextNode).updateView(mUIImplementation); + try { + ((PropsAnimatedNode) nextNode).updateView(mUIImplementation); + } catch (IllegalViewOperationException e) { + // An exception is thrown if the view hasn't been created yet. This can happen because views are + // created in batches. If this particular view didn't make it into a batch yet, the view won't + // exist and an exception will be thrown when attempting to start an animation on it. + // + // Eat the exception rather than crashing. The impact is that we may drop one or more frames of the + // animation. + FLog.e(ReactConstants.TAG, "Native animation workaround, frame lost as result of race condition", e); + } } if (nextNode instanceof ValueAnimatedNode) { // Potentially send events to JS when the node's value is updated