2013-06-08 11 views
5

Mam następujące błędy, które nie mam pojęcia o:AndEngine GLES2- IndexOutOfBoundsException wewnątrz Entity.java line: 1402

06-08 19:59:54.367: E/AndroidRuntime(11629): FATAL EXCEPTION: UpdateThread 
06-08 19:59:54.367: E/AndroidRuntime(11629): java.lang.IndexOutOfBoundsException: Invalid index 11, size is 0 
06-08 19:59:54.367: E/AndroidRuntime(11629): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at java.util.ArrayList.get(ArrayList.java:304) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at org.andengine.entity.Entity.onManagedUpdate(Entity.java:1402) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at org.andengine.entity.scene.Scene.onManagedUpdate(Scene.java:284) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at org.andengine.entity.Entity.onUpdate(Entity.java:1167) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at org.andengine.engine.Engine.onUpdateScene(Engine.java:591) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at org.andengine.engine.Engine.onUpdate(Engine.java:586) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at org.andengine.engine.Engine.onTickUpdate(Engine.java:548) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at org.andengine.engine.Engine$UpdateThread.run(Engine.java:820) 

wierzę, że to coś związane z onManagedUpdate() wewnątrz MoveModifier użyłem w moim kodu .

Odpowiedz

7

Jest to prawie zawsze spowodowane odłączeniem obiektów w niewłaściwym wątku. Sprawdź, czy możesz odłączyć elementy w odpowiedzi na interakcję użytkownika lub wywołanie zwrotne modyfikatora i opakować je w runOnUpdateThread. Np .:

@Override 
public void onModifierFinished(IModifier<IEntity> pModifier, IEntity pItem) { 
    engine.runOnUpdateThread(new Runnable() { 
     @Override 
     public void run() { 
      widget.detachSelf(); 
     } 
    }); 
} 
+0

Jeśli nie mogę odłączyć go naModifierFinished, to gdzie jeszcze mogę go odłączyć? Zmieniam scenę naModifierFinished. Jakieś pomysły? – Nafis

+2

Możesz odłączyć go w onModifierFinished tak długo, jak zawinąć go w "runOnUpdateThread", jak w moim przykładzie. Działa to dobrze, ponieważ nie uruchamia odłączenia w bieżącym wątku - zamiast tego mówi "aktualizuj wątek", aby wykonać go tak szybko, jak to możliwe. – simonp

+1

Powodem, dla którego to rozwiązuje problem, jest to, że pozwala on wątkowi aktualizacji, aby upewnić się, że zmiany sceny nie następują, gdy znajduje się w trakcie iteracji nad sceną. Jeśli wykonasz odłączenie poza wątkiem aktualizacji, ryzykujesz, że to zrobisz, podczas gdy wątek aktualizacji przeplata tablicę zawierającą ten obiekt i wyzwala wyjątek ArrayIndexOutOfBoundsException - dokładnie to, co się z tobą stało. – simonp