ArrayIndexOutOfBoundsException xmlserializer

У меня есть код, который создает файл kml с помощью XMLserializer, Он отлично работает при создании разных полигонов, но у меня возникает ошибка при закрытии xml, которую я действительно не понимаю.

02-09 10:03:02.919 24712-26301/com.example.accgps W/System.err: java.lang.ArrayIndexOutOfBoundsException: length=24; index=-3
02-09 10:03:02.919 24712-26301/com.example.accgps W/System.err:     at org.kxml2.io.KXmlSerializer.endTag(KXmlSerializer.java:493)
02-09 10:03:02.919 24712-26301/com.example.accgps W/System.err:     at com.example.accgps.KMLHelper.SerialEnd(KMLHelper.java:150)
02-09 10:03:02.919 24712-26301/com.example.accgps W/System.err:     at com.example.accgps.RefreshKML$1.run(RefreshKML.java:283)
02-09 10:03:02.919 24712-26301/com.example.accgps W/System.err:     at java.lang.Thread.run(Thread.java:818)*

Призыв к SerialEnd() делается после создания полигонов, которые работают нормально, поэтому я не знаю, почему это выходит за пределы:

        for (s = 0; s < PolyArray.size(); s++) {
            polygon = PolyArray.get(s);
            kH.SerialPlacePol("Tramo " + i, polygon);
            i++;
        }
        Log.i(TAG, "RefreshKML: se han creado " + (i - 1) + " tramos");
        editor.putInt("poligonos", i);
        editor.apply();
    } else {
        Toast.makeText(getApplicationContext(),"No existen datos suficientes para "+
        "generar el archivo KML",Toast.LENGTH_SHORT).show();
    }
} else {
    Log.d(TAG, "RefreshKML: No hay datos de GPS suficientes");
}

if (end) { //Solo cierra el archivo si se termina la recopilación de datos
    kH.SerialEnd();
    end = false; //En caso de que no se completó esta opción
    copyAllFiles();
}

Ошибка спровоцирована в первой строке SerialEnd() метод:

public void SerialEnd () {
    try{
        serializer.endTag(null,"Document"); //THIS IS THE LINE WITH THE ERROR
        serializer.endTag(null,"kml");
        //serializer.endDocument();
        //serializer.flush();
        fileos.close();
        Log.d(TAG,"KMLHelper: SerialEnd cierra archivo KML");
    }catch(Exception e){
        Log.d(TAG,"KMLHelper: Exception occured in SerialEnd");
        e.printStackTrace();
    }
}

Я пытался найти ответ на другие вопросы, но я не нашел правильного решения, возможно, сериализатор закрыт, но я этого еще не сделал

Вот как я создаю XMLserializerВ случае, если вы видите проблему здесь:

public KMLHelper(File file) {
    try{
        serializer.endTag(null, "Document");
        serializer.endTag(null, "kml");
        serializer.endDocument();
        serializer.flush();
        Log.d(TAG,"KMLHelper: SerialEnd cierra archivo KML");
    }catch(Exception e){
        Log.d(TAG,"KMLHelper: Exception occurred in SerialEnd");
        e.printStackTrace();
    }finally {
        try {fileos.close();} catch (IOException io) {io.printStackTrace();}
    }
}

Изменить: я сделал некоторые изменения в SerialEnd(), поместите закрытие файла в метод finally и раскомментируйте метод endDocument. Я также контролировал доступ к потоку, который создает XML-файл с синхронизацией с созданием намерения, которое контролирует создание XML-файла со всеми полигонами.

1 ответ

Решение

Решено! Проблема заключалась в том, что он создавал 2 XMLserializer, работающие с одним файлом. Я изменил способ, которым служба вызывает метод, теперь я использую фоновый поток для выполнения вызовов и контролирую выполнение с помощью join(), поэтому одновременно выполняется только 1 выполнение.

Другие вопросы по тегам