画面上のオブジェクトの移動に関するデータを格納するために配列リストを使用しています。これは、レンダラーとロジックが別々のスレッドで実行されているためだと思われますが、データがリストから削除されると、indexOutOfBoundsException が発生することがあります。try/catch を含め、これを回避するために考えられるすべての手順を実行しましたが、それでも例外が発生することがあります。これは、例外の原因と思われるレンダラー スレッドの一部です。
public void drawMobs(GL10 gl) {
boolean playing = MyLaunchActivity.getPlaying();
if(playing == true){
try{
ArrayList<String> mobDat = Play.getMobDat();
while (currentLoadSpace < mobDat.size()){
if(!mobDat.isEmpty() || currentLoadSpace < mobDat.size()){
loadObject = mobDat.get(currentLoadSpace);
float loadCoordX = Float.parseFloat(mobDat.get(currentLoadSpace + 2));
float loadCoordY = Float.parseFloat(mobDat.get(currentLoadSpace + 3));
/*some rendering*/
currentLoadSpace+=4;
}
}
}catch( ArrayIndexOutOfBoundsException e){ Log.d(TAG, "caught");}
currentLoadSpace = 0;
}}
ご覧のとおり、いくつか試してみましたが、それでもエラーが発生します。エラーログはこちら
01-02 14:02:42.650: E/AndroidRuntime(6947): FATAL EXCEPTION: GLThread 10
01-02 14:02:42.650: E/AndroidRuntime(6947): java.lang.IndexOutOfBoundsException: Invalid index 23, size is 20
01-02 14:02:42.650: E/AndroidRuntime(6947): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
01-02 14:02:42.650: E/AndroidRuntime(6947): at java.util.ArrayList.get(ArrayList.java:308)
01-02 14:02:42.650: E/AndroidRuntime(6947): at basicmelon.games.agameofsorts.LoadLevel.drawMobs(LoadLevel.java:530)
01-02 14:02:42.650: E/AndroidRuntime(6947): at basicmelon.games.agameofsorts.MyGLSurfaceRenderer.onDrawFrame(MyGLSurfaceRenderer.java:82)
01-02 14:02:42.650: E/AndroidRuntime(6947): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1429)
01-02 14:02:42.650: E/AndroidRuntime(6947): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1184)