PG日誌

読者です 読者をやめる 読者になる 読者になる

PG日誌

主にc#の事を書いています

AndEngineでdetachSelfしたときに例外が出る場合の対処法

Java Android AndEngine

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文でリストをなめてるところがあって、回している最中にリストが短くなって最後の要素にアクセスしたときに配列外参照が起きてるっぽい。

広告を非表示にする