I’m developing a game with android using andengine. Basically, I’m using 2 ArrayList to store my 2 types of Sprites. I’m adding and removing both types of Sprite at runtime, in reaction to user interaction. However, I’ll get random crashes with only the following error codes:
10-09 12:11:13.532: A/libc(8015): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)
10-09 12:11:13.572: V/AndEngine(8015): org.andengine.input.touch.TouchEvent$TouchEventPool<TouchEvent> was exhausted, with 2 item not yet recycled. Allocated 1 more.
10-09 12:11:13.572: V/AndEngine(8015): org.andengine.util.adt.pool.PoolUpdateHandler$1<TouchEventRunnablePoolItem> was exhausted, with 2 item not yet recycled. Allocated 1 more.
10-09 12:11:13.602: V/AndEngine(8015): org.andengine.input.touch.TouchEvent$TouchEventPool<TouchEvent> was exhausted, with 3 item not yet recycled. Allocated 1 more.
10-09 12:11:13.602: V/AndEngine(8015): org.andengine.util.adt.pool.PoolUpdateHandler$1<TouchEventRunnablePoolItem> was exhausted, with 3 item not yet recycled. Allocated 1 more.
10-09 12:11:13.622: V/AndEngine(8015): org.andengine.input.touch.TouchEvent$TouchEventPool<TouchEvent> was exhausted, with 4 item not yet recycled. Allocated 1 more.
10-09 12:11:13.622: V/AndEngine(8015): org.andengine.util.adt.pool.PoolUpdateHandler$1<TouchEventRunnablePoolItem> was exhausted, with 4 item not yet recycled. Allocated 1 more.
10-09 12:11:16.195: V/AndEngine(8015): org.andengine.input.touch.TouchEvent$TouchEventPool<TouchEvent> was exhausted, with 5 item not yet recycled. Allocated 1 more.
10-09 12:11:16.195: V/AndEngine(8015): org.andengine.util.adt.pool.PoolUpdateHandler$1<TouchEventRunnablePoolItem> was exhausted, with 5 item not yet recycled. Allocated 1 more.
10-09 12:11:16.275: V/AndEngine(8015): org.andengine.input.touch.TouchEvent$TouchEventPool<TouchEvent> was exhausted, with 6 item not yet recycled. Allocated 1 more.
10-09 12:11:16.275: V/AndEngine(8015): org.andengine.util.adt.pool.PoolUpdateHandler$1<TouchEventRunnablePoolItem> was exhausted, with 6 item not yet recycled. Allocated 1 more.
As I continue to move my finger on the screen, the TouchEvent pool warnings continue popping up, but the game itself is hung. I honestly have no idea what is causing this! I’ve done a lot of looking around, and can’t even pinpoint the crash on a single action.
My method of creating/removing my Sprites is as follows:
TypeASprite:
- create inside a
TimerHandler - remove inside
ContactListenerspawning arunOnUpdateThread()Runnable
TypeBSprite:
- create inside a overriden
onSceneTouchEvent(), since the Activity extends anIOnSceneTouchListener. - remove inside
ContactListenerspawning arunOnUpdateThread()Runnable
Each time a Sprite is created, it’s added to its respective ArrayList. When it needs to be removed, it’s removed from the ArrayList through the ContactListener.
Any help/ideas would be really appreciated! Thanks!
EDIT: Through some trial and error, I’m pretty sure the issue is with the TypeBSprite
EDIT: I’ve implemented my TypeBSprite creation like this:
mEngine.runOnUpdateThread(new Runnable() {
@Override
public void run() {
AnimatedSprite sprite = new AnimatedSprite(sX, sY, mSpriteRegion, getVertexBufferObjectManager());
sprite.setRotation(sRotation);
mScene.attachChild(sprite);
Body body = PhysicsFactory.createBoxBody(mPhysicsWorld, sprite, BodyType.StaticBody, MY_FIXTURE);
sprite.setUserData("spiteB");
body.setUserData(sprite);
mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(sprite, body, true, true));
}
});
Figured it out! The problem lies in the time gap between registering an
runOnUpdateThreadRunnableand the actual execution of it. The problem was that theContactListenerwas being called multiple times for the same collision, and thus therunOnUpdateThreadbeing used to delete the bodies was being called multiple times on the same object.To fix it, I made the
ContactListenerset theUserDataof the Sprite to “deleted”. When theContactListenerwas called again on the same object, the “if (...)statements comparingSprite‘sUserDatawould ignore it, since it should be on the road to deletion already.Hope this helps someone in the future!