|
44 | 44 | import android.os.Handler; |
45 | 45 | import android.os.Looper; |
46 | 46 | import android.util.AttributeSet; |
| 47 | +import android.util.Log; |
47 | 48 | import android.view.Choreographer; |
48 | 49 | import android.view.View; |
49 | 50 |
|
| 51 | +import androidx.annotation.MainThread; |
50 | 52 | import androidx.annotation.NonNull; |
51 | 53 |
|
52 | 54 | import java.io.File; |
@@ -291,7 +293,7 @@ public void loadFromHttp (URL atlasUrl, URL skeletonUrl, File targetDirectory) { |
291 | 293 | /** The same as {@link SpineView#loadFromDrawable(AndroidSkeletonDrawable, Context, SpineController)}, but can be used after |
292 | 294 | * instantiating the view via {@link SpineView#SpineView(Context, SpineController)}. */ |
293 | 295 | public void loadFromDrawable (AndroidSkeletonDrawable drawable) { |
294 | | - loadFrom( () -> drawable); |
| 296 | + post( () -> setSkeletonDrawable(drawable)); |
295 | 297 | } |
296 | 298 |
|
297 | 299 | /** Get the {@link SpineController} */ |
@@ -350,21 +352,36 @@ public void setRendering (Boolean rendering) { |
350 | 352 | this.rendering = rendering; |
351 | 353 | } |
352 | 354 |
|
353 | | - private void loadFrom (AndroidSkeletonDrawableLoader loader) { |
| 355 | + /** Load the skeleton from a {@link AndroidSkeletonDrawableLoader}. This method is asynchronous. |
| 356 | + * If you want to control the loading thread yourself, obtain an {@link AndroidSkeletonDrawable} |
| 357 | + * using {@link AndroidSkeletonDrawable#fromHttp(URL, URL, File)} or another load method, |
| 358 | + * then call {@link SpineView#loadFromDrawable(AndroidSkeletonDrawable)} or |
| 359 | + * {@link SpineView#setSkeletonDrawable(AndroidSkeletonDrawable)}. */ |
| 360 | + public void loadFrom (AndroidSkeletonDrawableLoader loader) { |
354 | 361 | Handler mainHandler = new Handler(Looper.getMainLooper()); |
355 | 362 | Thread backgroundThread = new Thread( () -> { |
356 | | - final AndroidSkeletonDrawable skeletonDrawable = loader.load(); |
357 | | - mainHandler.post( () -> { |
358 | | - computedBounds = boundsProvider.computeBounds(skeletonDrawable); |
359 | | - updateCanvasTransform(); |
360 | | - |
361 | | - controller.init(skeletonDrawable); |
362 | | - Choreographer.getInstance().postFrameCallback(SpineView.this); |
363 | | - }); |
| 363 | + try { |
| 364 | + final AndroidSkeletonDrawable skeletonDrawable = loader.load(); |
| 365 | + mainHandler.post( () -> { |
| 366 | + setSkeletonDrawable(skeletonDrawable); |
| 367 | + }); |
| 368 | + }catch (Exception e) { |
| 369 | + Log.e("SpineView", "Error loading skeleton", e); |
| 370 | + } |
364 | 371 | }); |
365 | 372 | backgroundThread.start(); |
366 | 373 | } |
367 | 374 |
|
| 375 | + /** Set the skeleton drawable. Must be called from the main thread.*/ |
| 376 | + @MainThread |
| 377 | + public final void setSkeletonDrawable (@NonNull AndroidSkeletonDrawable skeletonDrawable) { |
| 378 | + computedBounds = boundsProvider.computeBounds(skeletonDrawable); |
| 379 | + updateCanvasTransform(); |
| 380 | + |
| 381 | + controller.init(skeletonDrawable); |
| 382 | + Choreographer.getInstance().postFrameCallback(SpineView.this); |
| 383 | + } |
| 384 | + |
368 | 385 | @Override |
369 | 386 | public void onDraw (@NonNull Canvas canvas) { |
370 | 387 | super.onDraw(canvas); |
|
0 commit comments