From 11814a5a81a1850a6c28c78252afa68be8348815 Mon Sep 17 00:00:00 2001 From: Ashwin Bharambe Date: Fri, 17 Mar 2017 16:47:56 -0700 Subject: [PATCH] Ensure `ResourceDrawableIdHelper` is thread-safe Reviewed By: jaegs Differential Revision: D4696625 fbshipit-source-id: e0aa7870ba02d8e6542c436d7f775bb251cf91ae --- .../imagehelper/ResourceDrawableIdHelper.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ResourceDrawableIdHelper.java b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ResourceDrawableIdHelper.java index fc0c041f02c..dd2465156ad 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ResourceDrawableIdHelper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ResourceDrawableIdHelper.java @@ -10,6 +10,7 @@ package com.facebook.react.views.imagehelper; import javax.annotation.Nullable; +import javax.annotation.concurrent.ThreadSafe; import java.util.HashMap; import java.util.Map; @@ -21,12 +22,13 @@ import android.net.Uri; /** * Helper class for obtaining information about local images. */ +@ThreadSafe public class ResourceDrawableIdHelper { private Map mResourceDrawableIdMap; private static final String LOCAL_RESOURCE_SCHEME = "res"; - private static ResourceDrawableIdHelper sResourceDrawableIdHelper; + private static volatile ResourceDrawableIdHelper sResourceDrawableIdHelper; private ResourceDrawableIdHelper() { mResourceDrawableIdMap = new HashMap(); @@ -34,12 +36,16 @@ public class ResourceDrawableIdHelper { public static ResourceDrawableIdHelper getInstance() { if (sResourceDrawableIdHelper == null) { - sResourceDrawableIdHelper = new ResourceDrawableIdHelper(); + synchronized (ResourceDrawableIdHelper.class) { + if (sResourceDrawableIdHelper == null) { + sResourceDrawableIdHelper = new ResourceDrawableIdHelper(); + } + } } return sResourceDrawableIdHelper; } - public void clear() { + public synchronized void clear() { mResourceDrawableIdMap.clear(); } @@ -48,15 +54,18 @@ public class ResourceDrawableIdHelper { return 0; } name = name.toLowerCase().replace("-", "_"); - if (mResourceDrawableIdMap.containsKey(name)) { - return mResourceDrawableIdMap.get(name); - } - int id = context.getResources().getIdentifier( + + synchronized (this) { + if (mResourceDrawableIdMap.containsKey(name)) { + return mResourceDrawableIdMap.get(name); + } + int id = context.getResources().getIdentifier( name, "drawable", context.getPackageName()); - mResourceDrawableIdMap.put(name, id); - return id; + mResourceDrawableIdMap.put(name, id); + return id; + } } public @Nullable Drawable getResourceDrawable(Context context, @Nullable String name) {