android – BaseGameActivity.runOnUpdateThread()与Entity.registerUpdateHandler()

前端之家收集整理的这篇文章主要介绍了android – BaseGameActivity.runOnUpdateThread()与Entity.registerUpdateHandler()前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我使用runOnUpdateThread()执行Runnable或者将更新处理程序注册到实体并使用它执行代码,有什么区别吗?

我想用Sprite.detachSelf()从场景中删除一个Sprite.在本例中,教程说必须在使用BaseGameActivity.runOnUpdateThread()的更新线程中调用方法.但是使用这个解决方案,我必须将activity对象传递给想要使用runOnUpdateThread()的每个对象.嗯……我不喜欢它.

我的问题是,如果我在Entity中创建一个RunnableHandler对象并使用registerUpdateHandler()注册它,并将新的Runnable添加到RunnableHandler,此解决方案是否与runOnUpdateThread()功能相同.这个Runnable是否在Update Thread中执行?

/* MySprite is attached to a Scene object */
public class MySprite extends Sprite {
   private final RunnableHandler UPDATE_HANDLER = new RunnableHandler();

   public MySprite() {
       registerUpdateHandler(UPDATE_HANDLER);
   }

   /* called when the sprite has to be removed from scene */
   public void removeMyself() {
       Runnable r = new Runnable() {
           public void run() {
               detachSelf();
           }
       };
       UPDATE_HANDLER.postRunnable(r);
   }
}

我问这个是因为标准解决方案一切正常.但是使用更新处理程序解决方案我得到了这个异常

FATAL EXCEPTION: UpdateThread
java.lang.IndexOutOfBoundsException: Invalid index 19,size is 19
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at org.andengine.entity.Entity.onManagedUpdate(Entity.java:1402)
at org.andengine.entity.scene.Scene.onManagedUpdate(Scene.java:284)
at org.andengine.entity.Entity.onUpdate(Entity.java:1167)
at org.andengine.engine.Engine.onUpdateScene(Engine.java:591)
at org.andengine.engine.Engine.onUpdate(Engine.java:586)
at org.andengine.engine.Engine.onTickUpdate(Engine.java:548)
at org.andengine.engine.Engine$UpdateThread.run(Engine.java:820)

通常在更新线程中未调用的附加/分离函数时出现.我对吗?
预先感谢您的帮助.

解决方法

看一下 Entity中的源代码,理论会发生什么:

>显示的行,获取实体计数= 19(来自日志)
>其中一个entity.get(i).onUpdate()调用removeMyself()
> detachSelf的runnable排队.
>在下一个entity.get(i).onUpdate()将导致UpdateHandler通过onUpdate运行(updatehandlers在onManagedUpdate中运行)
> detachSelf从父列表(调用者)中删除子项(其中条目计数仍为19,但mChildren / entities的长度现为18)

只是从查看代码的理论……我认为开始得到答案的一个好点是在Entity中查看循环并查看循环期间是否修改了“实体”. (注意:’最终实体’只是阻止重新分配变量,而不是修改列表)

原文链接:https://www.f2er.com/android/318001.html

猜你在找的Android相关文章