BaseGameActivity.runOnUpdateThread()与Entity.registerUpdateHandler()

alb*_*lcs 8 android andengine

如果我执行一个Runnablewith runOnUpdateThread()或者我将一个更新处理程序注册到一个Entity并用它执行代码有什么区别吗?

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

我的问题是,如果我RunnableHandler在Entity中创建一个对象并注册它registerUpdateHandler()并添加了新的Runnable RunnableHandler,这个解决方案是否与该runOnUpdateThread()功能相同.这是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);
   }
}
Run Code Online (Sandbox Code Playgroud)

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

致命异常:UpdateThread java.lang.IndexOutOfBoundsException:无效的索引19,在java的java.util.ArrayList.get(ArrayList.java:258)的java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)中的大小为19. org.andengine.eceity.Scene.onManagedUpdate(Scene.java:284)中的andengine.entity.Entity.onManagedUpdate(Entity.java:1402)org.andengine.entity.Entity.onUpdate(Entity.java:1167) org.andengine.engine.Engine.onUpdateScene(Engine.java:591)org.andengine.engine.onUpdate(Engine.java:586)org.andengine.engine.Engine.onTickUpdate(Engine.java:548) )org.andengine.engine.Engine $ UpdateThread.run(Engine.java:820)

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

Dan*_*man 2

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

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

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