StackOverFlowに普通に書いてあるありますが、自分用のメモまでに…
状況
AnimatedSpriteへAnimatedSprite.IAnimationListenerを設定して匿名クラス内でdetachSelfを記述したときに「IndexOutOfBoundsException」が発生する。
java.lang.IndexOutOfBoundsException: Invalid index 5, size is 5 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.LimitedFPSEngine.onUpdate(LimitedFPSEngine.java:56) at org.andengine.engine.Engine.onTickUpdate(Engine.java:548) at org.andengine.engine.Engine$UpdateThread.run(Engine.java:820)
対策
フレームが更新されるときにAndEngineが適切なタイミングでdetachSelf()を呼び出してくれるように以下のように修正する。
BaseResource.getEngine().runOnUpdateThread(new Runnable() { @Override public void run() { detachSelf(); } });
こうすると発生しなくなります。
考察
detachSelfするとAndEngine内のリソースを持ってるArrayListから情報が削除されて1件Listが短くなるけど、for文でリストをなめてるところがあって、回している最中にリストが短くなって最後の要素にアクセスしたときに配列外参照が起きてるっぽい。