Android BaseGameActivity.runOnUpdateThread()与Entity.registerUpdateHandler()的比较

Android BaseGameActivity.runOnUpdateThread()与Entity.registerUpdateHandler()的比较,android,andengine,Android,Andengine,如果我使用runOnUpdateThread()执行Runnable,或者我将更新处理程序注册到一个实体中并使用该实体执行代码,有什么区别吗 我想使用Sprite.detachSelf()从场景中删除一个Sprite。在这种情况下,教程说必须在更新线程中使用BaseGameActivity.runOnUpdateThread()调用此方法。但是使用此解决方案,我必须将activity对象传递给希望使用runOnUpdateThread()的每个对象。好。。。我不喜欢它 我的问题是,如果我在一个实

如果我使用
runOnUpdateThread()
执行
Runnable
,或者我将更新处理程序注册到一个实体中并使用该实体执行代码,有什么区别吗

我想使用
Sprite.detachSelf()
从场景中删除一个
Sprite
。在这种情况下,教程说必须在更新线程中使用
BaseGameActivity.runOnUpdateThread()
调用此方法。但是使用此解决方案,我必须将activity对象传递给希望使用
runOnUpdateThread()
的每个对象。好。。。我不喜欢它

我的问题是,如果我在一个实体中创建一个
RunnableHandler
对象,并将其注册到
registerUpdateHandler()
中,并且新的Runnable被添加到
RunnableHandler
,那么这个解决方案是否与
rununUpdateThread()
功能相同。这是在更新线程中执行的
Runnable

/* 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);
   }
}
我这样问是因为有了标准解决方案,一切都很好。但使用更新处理程序解决方案,我遇到了以下异常:

致命异常:UpdateThread java.lang.IndexOutOfBoundsException:索引19无效,大小为19 位于java.util.ArrayList.ThrowindexOutfBoundsException(ArrayList.java:255) 获取(ArrayList.java:308) 位于org.andengine.entity.entity.onManagedUpdate(entity.java:1402) 位于org.andengine.entity.scene.scene.onManagedUpdate(scene.java:284) 位于org.andengine.entity.entity.onUpdate(entity.java:1167) 位于org.andengine.engine.engine.onUpdate场景(engine.java:591) 位于org.andengine.engine.engine.onUpdate(engine.java:586) 位于org.andengine.engine.engine.onTickUpdate(engine.java:548) 位于org.andengine.engine.engine$UpdateThread.run(engine.java:820)

它通常在更新线程中调用而不是附加/分离函数时出现。我说得对吗?
提前感谢您的帮助。

从理论上看源代码会发生什么:

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

  • 只是一个从代码看的理论。。。我认为开始得到答案的一个好办法是查看中的循环,看看“实体”是否在循环过程中被修改。(注意:“最终实体”只是防止重新指定变量,而不是修改列表)

    为什么不在场景中创建包含这些精灵的分离逻辑?您的场景可以从包含活动引用的基本场景扩展,或者如果您不希望使用该基本场景方法,也可以在该场景中创建活动的周引用。这些方法中的任何一种都能帮助你实现你的目标吗?嗨,Guillhe,我当然能用其他方法解决这个问题。但我的问题完全不同。我不明白为什么我在使用描述的代码时会出现上述异常。注册的更新处理程序代码是否真的像我预期的那样在更新线程中调用?若否,原因为何?