我想用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)
解决方法
>显示的行,获取实体计数= 19(来自日志)
>其中一个entity.get(i).onUpdate()调用removeMyself()
> detachSelf的runnable排队.
>在下一个entity.get(i).onUpdate()将导致UpdateHandler通过onUpdate运行(updatehandlers在onManagedUpdate中运行)
> detachSelf从父列表(调用者)中删除子项(其中条目计数仍为19,但mChildren / entities的长度现为18)
只是从查看代码的理论……我认为开始得到答案的一个好点是在Entity中查看循环并查看循环期间是否修改了“实体”. (注意:’最终实体’只是阻止重新分配变量,而不是修改列表)