0

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

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();} 
    } 
} 

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

ответ

0

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