diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedAsyncTask.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedAsyncTask.java index 917c1279c667bd..83a7fb014e34c9 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedAsyncTask.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedAsyncTask.java @@ -16,9 +16,8 @@ * handled by the {@link com.facebook.react.bridge.NativeModuleCallExceptionHandler} registered if * the app is in dev mode. * - * This class doesn't allow doInBackground to return a results. This is mostly because when this - * class was written that functionality wasn't used and it would require some extra code to make - * work correctly with caught exceptions. Don't let that stop you from adding it if you need it :) + * This class doesn't allow doInBackground to return a results. If you need this + * use GuardedResultAsyncTask instead. */ public abstract class GuardedAsyncTask extends AsyncTask { diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedResultAsyncTask.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedResultAsyncTask.java new file mode 100644 index 00000000000000..db13a71464e4a9 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedResultAsyncTask.java @@ -0,0 +1,43 @@ +// Copyright 2004-present Facebook. All Rights Reserved. + +package com.facebook.react.bridge; + +import android.os.AsyncTask; + +/** + * Abstract base for a AsyncTask with result support 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 GuardedResultAsyncTask + extends AsyncTask { + + private final ReactContext mReactContext; + + protected GuardedResultAsyncTask(ReactContext reactContext) { + mReactContext = reactContext; + } + + @Override + protected final Result doInBackground(Void... params) { + try { + return doInBackgroundGuarded(); + } catch (RuntimeException e) { + mReactContext.handleException(e); + throw e; + } + } + + @Override + protected final void onPostExecute(Result result) { + try { + onPostExecuteGuarded(result); + } catch (RuntimeException e) { + mReactContext.handleException(e); + } + } + + protected abstract Result doInBackgroundGuarded(); + protected abstract void onPostExecuteGuarded(Result result); + +}