@@ -24,6 +24,7 @@ import android.graphics.SurfaceTexture
2424import android.graphics.fonts.Font
2525import android.graphics.text.MeasuredText
2626import android.os.Build
27+ import android.os.Handler
2728import android.view.PixelCopy
2829import android.view.Surface
2930import 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