From 3c24dd4c833fc1a795ed1961557f1a61c7d4123a Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Wed, 3 Aug 2022 18:43:26 +0200 Subject: [PATCH] Weakly reference Activity for transaction finished callback (#2203) --- CHANGELOG.md | 1 + .../core/ActivityLifecycleIntegration.java | 32 +++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2f77a36bc..67b3837cff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Fixes - Prevent NPE by checking SentryTracer.timer for null again inside synchronized ([#2200](https://github.com/getsentry/sentry-java/pull/2200)) +- Weakly reference Activity for transaction finished callback ([#2203](https://github.com/getsentry/sentry-java/pull/2203)) - `attach-screenshot` set on Manual init. didn't work ([#2186](https://github.com/getsentry/sentry-java/pull/2186)) - Remove extra space from `spring.factories` causing issues in old versions of Spring Boot ([#2181](https://github.com/getsentry/sentry-java/pull/2181)) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java index 86b0c089ed..61c2f77b9d 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java @@ -23,6 +23,7 @@ import io.sentry.util.Objects; import java.io.Closeable; import java.io.IOException; +import java.lang.ref.WeakReference; import java.util.Date; import java.util.List; import java.util.Map; @@ -146,6 +147,7 @@ private void stopPreviousTransactions() { } private void startTracing(final @NotNull Activity activity) { + WeakReference weakActivity = new WeakReference<>(activity); if (performanceEnabled && !isRunningTransaction(activity) && hub != null) { // as we allow a single transaction running on the bound Scope, we finish the previous ones stopPreviousTransactions(); @@ -167,7 +169,20 @@ private void startTracing(final @NotNull Activity activity) { (Date) null, true, (finishingTransaction) -> { - activityFramesTracker.setMetrics(activity, finishingTransaction.getEventId()); + @Nullable Activity unwrappedActivity = weakActivity.get(); + if (unwrappedActivity != null) { + activityFramesTracker.setMetrics( + unwrappedActivity, finishingTransaction.getEventId()); + } else { + if (options != null) { + options + .getLogger() + .log( + SentryLevel.WARNING, + "Unable to track activity frames as the Activity %s has been destroyed.", + activityName); + } + } }); } else { // start transaction with app start timestamp @@ -178,7 +193,20 @@ private void startTracing(final @NotNull Activity activity) { appStartTime, true, (finishingTransaction) -> { - activityFramesTracker.setMetrics(activity, finishingTransaction.getEventId()); + @Nullable Activity unwrappedActivity = weakActivity.get(); + if (unwrappedActivity != null) { + activityFramesTracker.setMetrics( + unwrappedActivity, finishingTransaction.getEventId()); + } else { + if (options != null) { + options + .getLogger() + .log( + SentryLevel.WARNING, + "Unable to track activity frames as the Activity %s has been destroyed.", + activityName); + } + } }); // start specific span for app start