Skip to content

Commit 3eb8f20

Browse files
committed
Ensure handler.post is caught gracefully
1 parent 2bd3de4 commit 3eb8f20

File tree

1 file changed

+22
-3
lines changed
  • sentry-android-replay/src/main/java/io/sentry/android/replay/screenshot

1 file changed

+22
-3
lines changed

sentry-android-replay/src/main/java/io/sentry/android/replay/screenshot/CanvasStrategy.kt

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import android.graphics.SurfaceTexture
2424
import android.graphics.fonts.Font
2525
import android.graphics.text.MeasuredText
2626
import android.os.Build
27+
import android.os.Handler
2728
import android.view.PixelCopy
2829
import android.view.Surface
2930
import android.view.View
@@ -102,6 +103,13 @@ internal class CanvasStrategy(
102103
}
103104
}
104105

106+
if (isClosed.get()) {
107+
options.logger.log(
108+
SentryLevel.DEBUG,
109+
"Canvas Strategy already closed, skipping pixel copy request",
110+
)
111+
return@Runnable
112+
}
105113
PixelCopy.request(
106114
surface,
107115
screenshot!!,
@@ -150,10 +158,9 @@ internal class CanvasStrategy(
150158

151159
if (!isClosed.get()) {
152160
unprocessedPictureRef.set(picture)
153-
// use the same handler for PixelCopy and pictureRenderTask
154161
executor
155162
.getBackgroundHandler()
156-
.post(ReplayRunnable("screenshot_recorder.canvas", pictureRenderTask))
163+
.postSafely(ReplayRunnable("screenshot_recorder.canvas", pictureRenderTask))
157164
}
158165
}
159166

@@ -165,7 +172,7 @@ internal class CanvasStrategy(
165172
isClosed.set(true)
166173
executor
167174
.getBackgroundHandler()
168-
.post(
175+
.postSafely(
169176
ReplayRunnable("CanvasStrategy.close") {
170177
screenshot?.let { synchronized(it) { if (!it.isRecycled) it.recycle() } }
171178
surface.release()
@@ -184,6 +191,18 @@ internal class CanvasStrategy(
184191
}
185192
}
186193
}
194+
195+
fun Handler.postSafely(runnable: ReplayRunnable) {
196+
try {
197+
post(runnable)
198+
} catch (t: Throwable) {
199+
options.logger.log(
200+
SentryLevel.ERROR,
201+
"Canvas Strategy: failed to post runnable ${runnable.taskName}",
202+
t,
203+
)
204+
}
205+
}
187206
}
188207

189208
@SuppressLint("UseKtx")

0 commit comments

Comments
 (0)