From 28f63436976f353bcd520eb3f6755154bdb8578c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felippo=20St=C3=A9dile?= <58120366+FelippoStedile@users.noreply.github.com> Date: Tue, 16 Jun 2026 14:04:27 -0300 Subject: [PATCH] fix(splash-screen): defer removeOnPreDrawListener to main looper to avoid stuck splash / crash on Android 12+ --- .../plugins/splashscreen/SplashScreen.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreen.java b/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreen.java index 756a2d6d5..bab33f8f1 100644 --- a/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreen.java +++ b/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreen.java @@ -538,11 +538,15 @@ private void hide(final int fadeOutDuration, boolean isLaunchSplash) { ); } this.isVisible = false; - if (null != content) { - content.getViewTreeObserver().removeOnPreDrawListener(this.onPreDrawListener); + final View hideContent = content; + final OnPreDrawListener listenerToRemove = this.onPreDrawListener; + if (null != hideContent) { + new Handler(context.getMainLooper()) + .post(() -> hideContent.getViewTreeObserver().removeOnPreDrawListener(listenerToRemove)); } this.onPreDrawListener = null; return; + } if (splashImage == null || splashImage.getParent() == null) { @@ -608,8 +612,11 @@ private void hideDialog(final AppCompatActivity activity, boolean isLaunchSplash // Hide with Android 12 API if (null != this.onPreDrawListener) { this.isVisible = false; - if (null != content) { - content.getViewTreeObserver().removeOnPreDrawListener(this.onPreDrawListener); + final View hideContent = content; + final OnPreDrawListener listenerToRemove = this.onPreDrawListener; + if (null != hideContent) { + new Handler(context.getMainLooper()) + .post(() -> hideContent.getViewTreeObserver().removeOnPreDrawListener(listenerToRemove)); } this.onPreDrawListener = null; return;