From f57c2a9140140bc54a83d4a87bde486e2f052ce5 Mon Sep 17 00:00:00 2001 From: Alexander Blom Date: Mon, 23 Nov 2015 02:16:27 -0800 Subject: [PATCH] Add GuardedResultAsyncTask Reviewed By: andreicoman11 Differential Revision: D2679459 fb-gh-sync-id: 8a9ec170ce76bbc3340c9e8872e19b78ae5a5c2d --- .../react/bridge/GuardedAsyncTask.java | 5 +-- .../react/bridge/GuardedResultAsyncTask.java | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedResultAsyncTask.java 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 917c1279c..83a7fb014 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 @@ import android.os.AsyncTask; * 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 000000000..db13a7146 --- /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); + +}