diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedRunnable.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedRunnable.java new file mode 100644 index 000000000..82c4d86ea --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedRunnable.java @@ -0,0 +1,28 @@ +// Copyright 2004-present Facebook. All Rights Reserved. + +package com.facebook.react.bridge; + +/** + * Abstract base for a Runnable that should have any RuntimeExceptions it throws + * handled by the {@link com.facebook.react.bridge.NativeModuleCallExceptionHandler} registered if + * the app is in dev mode. + */ +public abstract class GuardedRunnable implements Runnable { + + private final ReactContext mReactContext; + + public GuardedRunnable(ReactContext reactContext) { + mReactContext = reactContext; + } + + @Override + public final void run() { + try { + runGuarded(); + } catch (RuntimeException e) { + mReactContext.handleException(e); + } + } + + public abstract void runGuarded(); +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java index 443dacdcc..938aaf88c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java @@ -20,6 +20,7 @@ import java.util.concurrent.TimeUnit; import com.facebook.react.animation.Animation; import com.facebook.react.animation.AnimationRegistry; import com.facebook.react.bridge.Callback; +import com.facebook.react.bridge.GuardedRunnable; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.SoftAssertions; import com.facebook.react.bridge.ReactContext; @@ -803,9 +804,9 @@ public class UIViewOperationQueue { // sure any late-arriving UI commands are executed. if (!mIsDispatchUIFrameCallbackEnqueued) { UiThreadUtil.runOnUiThread( - new Runnable() { + new GuardedRunnable(mReactApplicationContext) { @Override - public void run() { + public void runGuarded() { flushPendingBatches(); } });