Skip to content

Commit 4191737

Browse files
venusicjfdu3
andauthored
[android]optimize skeleton drawable load, Avoid app crashes caused by loading errors. (#2947)
Co-authored-by: jfdu3 <jfdu3@iflytek.com>
1 parent 3ffea50 commit 4191737

File tree

1 file changed

+27
-10
lines changed
  • spine-android/spine-android/src/main/java/com/esotericsoftware/spine/android

1 file changed

+27
-10
lines changed

spine-android/spine-android/src/main/java/com/esotericsoftware/spine/android/SpineView.java

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,11 @@
4444
import android.os.Handler;
4545
import android.os.Looper;
4646
import android.util.AttributeSet;
47+
import android.util.Log;
4748
import android.view.Choreographer;
4849
import android.view.View;
4950

51+
import androidx.annotation.MainThread;
5052
import androidx.annotation.NonNull;
5153

5254
import java.io.File;
@@ -291,7 +293,7 @@ public void loadFromHttp (URL atlasUrl, URL skeletonUrl, File targetDirectory) {
291293
/** The same as {@link SpineView#loadFromDrawable(AndroidSkeletonDrawable, Context, SpineController)}, but can be used after
292294
* instantiating the view via {@link SpineView#SpineView(Context, SpineController)}. */
293295
public void loadFromDrawable (AndroidSkeletonDrawable drawable) {
294-
loadFrom( () -> drawable);
296+
post( () -> setSkeletonDrawable(drawable));
295297
}
296298

297299
/** Get the {@link SpineController} */
@@ -350,21 +352,36 @@ public void setRendering (Boolean rendering) {
350352
this.rendering = rendering;
351353
}
352354

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) {
354361
Handler mainHandler = new Handler(Looper.getMainLooper());
355362
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+
}
364371
});
365372
backgroundThread.start();
366373
}
367374

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+
368385
@Override
369386
public void onDraw (@NonNull Canvas canvas) {
370387
super.onDraw(canvas);

0 commit comments

Comments
 (0)