Add GuardedRunnable to run blocks of code on the UI thread with automatic redboxing

Summary: Like GuardedAsyncTask, et al, but for Runnables.

Reviewed By: achen1

Differential Revision: D4537287

fbshipit-source-id: 8ae60c7007843c0b7d8e5c3835d0847921fb3db5
This commit is contained in:
Andy Street 2017-02-09 11:28:57 -08:00 committed by Facebook Github Bot
parent a6e4977662
commit 08db896321
2 changed files with 31 additions and 2 deletions

View File

@ -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();
}

View File

@ -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();
}
});