如果我执行有什么区别Runnable
with runOnUpdateThread()
或者我将更新处理程序注册到实体中并用它执行代码?
我想删除一个Sprite
从场景Sprite.detachSelf()
。在这种情况下,教程说必须在更新线程中调用此方法BaseGameActivity.runOnUpdateThread()
。但是通过这个解决方案,我必须将活动对象传递给每个想要使用的对象runOnUpdateThread()
。嗯...我不喜欢它。
我的问题是如果我创建一个RunnableHandler
实体中的对象并将其注册到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);
}
}
我问这个是因为使用标准解决方案一切正常。但通过更新处理程序解决方案,我得到了这个异常:
致命异常:UpdateThread
java.lang.IndexOutOfBoundsException:无效索引 19,大小为 19
在java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
在 java.util.ArrayList.get(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.onUpdateScene(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)
它通常在调用附加/分离函数时出现not在更新线程中。我对吗?
预先感谢您的帮助。
查看源代码中Entity https://github.com/nicolasgramlich/AndEngine/blob/GLES2/src/org/andengine/entity/Entity.java#L1400理论上发生的情况是:
- 显示的行选取实体计数 = 19(来自日志)
- 其中一个entity.get(i).onUpdate() 调用removeMyself()
- detachSelf 的可运行程序已排队。
- 下一个entity.get(i).onUpdate()将导致UpdateHandler通过以下方式运行onUpdate https://github.com/nicolasgramlich/AndEngine/blob/GLES2/src/org/andengine/entity/Entity.java#L1165(更新处理程序在 onManagedUpdate 中运行)
- the 分离自我 https://github.com/nicolasgramlich/AndEngine/blob/GLES2/src/org/andengine/entity/Entity.java#L705从父列表(调用者)中删除子项(其中条目计数仍为 19,但 mChildren/entities 的长度现在为 18)
只是查看代码的理论......我认为开始获得答案的一个好点是查看循环Entity https://github.com/nicolasgramlich/AndEngine/blob/GLES2/src/org/andengine/entity/Entity.java#L1400并查看“实体”在循环期间是否被修改。 (注意:“最终实体”只是防止重新分配变量,而不是修改列表)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)