From 9d488a4f65f85cf322accc3f142696d52a5290c2 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Fri, 27 Feb 2026 19:13:31 +0100 Subject: [PATCH] [android] throw clear IllegalStateException when controller is missing --- .../esotericsoftware/spine/android/SpineView.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/spine-android/spine-android/src/main/java/com/esotericsoftware/spine/android/SpineView.java b/spine-android/spine-android/src/main/java/com/esotericsoftware/spine/android/SpineView.java index bf5f75e44..9310612c1 100644 --- a/spine-android/spine-android/src/main/java/com/esotericsoftware/spine/android/SpineView.java +++ b/spine-android/spine-android/src/main/java/com/esotericsoftware/spine/android/SpineView.java @@ -358,11 +358,19 @@ public class SpineView extends View implements Choreographer.FrameCallback { * {@link SpineView#loadFromDrawable(AndroidSkeletonDrawable)} or * {@link SpineView#setSkeletonDrawable(AndroidSkeletonDrawable)}. */ public void loadFrom (AndroidSkeletonDrawableLoader loader) { + if (controller == null) { + throw new IllegalStateException( + "SpineController is not set. When using SpineView from XML, call setController(...) before loadFromAsset/loadFromFile/loadFromHttp/loadFromDrawable."); + } Handler mainHandler = new Handler(Looper.getMainLooper()); Thread backgroundThread = new Thread( () -> { try { final AndroidSkeletonDrawable skeletonDrawable = loader.load(); mainHandler.post( () -> { + if (controller == null) { + throw new IllegalStateException( + "SpineController became null before initialization. Ensure setController(...) is called and not cleared until loading completes."); + } setSkeletonDrawable(skeletonDrawable); }); } catch (Exception e) { @@ -375,6 +383,10 @@ public class SpineView extends View implements Choreographer.FrameCallback { /** Set the skeleton drawable. Must be called from the main thread. */ @MainThread public final void setSkeletonDrawable (@NonNull AndroidSkeletonDrawable skeletonDrawable) { + if (controller == null) { + throw new IllegalStateException( + "SpineController is not set. When using SpineView from XML, call setController(...) before setSkeletonDrawable/loadFromAsset/loadFromFile/loadFromHttp/loadFromDrawable."); + } computedBounds = boundsProvider.computeBounds(skeletonDrawable); updateCanvasTransform();