diff --git a/android/src/main/java/cn/reactnative/modules/update/UpdateContext.java b/android/src/main/java/cn/reactnative/modules/update/UpdateContext.java index fbddab0..a8bc8d9 100644 --- a/android/src/main/java/cn/reactnative/modules/update/UpdateContext.java +++ b/android/src/main/java/cn/reactnative/modules/update/UpdateContext.java @@ -22,6 +22,10 @@ public class UpdateContext { public static boolean DEBUG = false; private static ReactInstanceManager mReactInstanceManager; private static boolean isUsingBundleUrl = false; + + // Singleton instance + private static UpdateContext sInstance; + private static final Object sLock = new Object(); public UpdateContext(Context context) { this.context = context; @@ -54,13 +58,17 @@ public class UpdateContext { boolean buildTimeChanged = !buildTime.equals(storedBuildTime); if (packageVersionChanged || buildTimeChanged) { + // Execute cleanUp before clearing SharedPreferences to avoid race condition + this.cleanUp(); + SharedPreferences.Editor editor = sp.edit(); editor.clear(); editor.putString("packageVersion", packageVersion); editor.putString("buildTime", buildTime); - editor.apply(); - - this.cleanUp(); + // Use commit() instead of apply() to ensure synchronous write completion + // This prevents race condition where getBundleUrl() might read null values + // if called before apply() completes + editor.commit(); } } @@ -227,12 +235,26 @@ public class UpdateContext { return mReactInstanceManager; } + /** + * Get singleton instance of UpdateContext + */ + public static UpdateContext getInstance(Context context) { + if (sInstance == null) { + synchronized (sLock) { + if (sInstance == null) { + sInstance = new UpdateContext(context.getApplicationContext()); + } + } + } + return sInstance; + } + public static String getBundleUrl(Context context) { - return new UpdateContext(context.getApplicationContext()).getBundleUrl(); + return getInstance(context).getBundleUrl(); } public static String getBundleUrl(Context context, String defaultAssetsUrl) { - return new UpdateContext(context.getApplicationContext()).getBundleUrl(defaultAssetsUrl); + return getInstance(context).getBundleUrl(defaultAssetsUrl); } public String getBundleUrl() { diff --git a/android/src/newarch/cn/reactnative/modules/update/UpdateModule.java b/android/src/newarch/cn/reactnative/modules/update/UpdateModule.java index 16c9630..fe2c9ee 100644 --- a/android/src/newarch/cn/reactnative/modules/update/UpdateModule.java +++ b/android/src/newarch/cn/reactnative/modules/update/UpdateModule.java @@ -27,7 +27,7 @@ public class UpdateModule extends NativePushySpec { } public UpdateModule(ReactApplicationContext reactContext) { - this(reactContext, new UpdateContext(reactContext.getApplicationContext())); + this(reactContext, UpdateContext.getInstance(reactContext)); } @Override diff --git a/android/src/oldarch/cn/reactnative/modules/update/UpdateModule.java b/android/src/oldarch/cn/reactnative/modules/update/UpdateModule.java index 526b518..9da29cf 100644 --- a/android/src/oldarch/cn/reactnative/modules/update/UpdateModule.java +++ b/android/src/oldarch/cn/reactnative/modules/update/UpdateModule.java @@ -40,7 +40,7 @@ public class UpdateModule extends ReactContextBaseJavaModule { } public UpdateModule(ReactApplicationContext reactContext) { - this(reactContext, new UpdateContext(reactContext.getApplicationContext())); + this(reactContext, UpdateContext.getInstance(reactContext)); } @Override diff --git a/harmony/pushy/src/main/ets/UpdateContext.ts b/harmony/pushy/src/main/ets/UpdateContext.ts index 51c6b0b..1d416e9 100644 --- a/harmony/pushy/src/main/ets/UpdateContext.ts +++ b/harmony/pushy/src/main/ets/UpdateContext.ts @@ -37,10 +37,10 @@ export class UpdateContext { this.preferences.putSync('packageVersion', packageVersion); this.preferences.flush(); } else if (storedVersion && packageVersion !== storedVersion) { + this.cleanUp(); this.preferences.clear(); this.preferences.putSync('packageVersion', packageVersion); this.preferences.flush(); - this.cleanUp(); } } catch (e) { console.error('Failed to init preferences:', e);