0

Ich habe einen Code, der eine KML-Datei mit XMLserializer erstellt. Es funktioniert gut, die verschiedenen Polygone zu erstellen, aber ich habe einen Fehler beim Schließen der XML, die ich wirklich nicht verstehe.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)* 

Der Aufruf der SerialEnd() wird nach dem Erstellen der Polygone, durchgeführt, die gut funktionieren, so dass ich weiß nicht, warum es außerhalb der Grenzen ist:

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

Der Fehler in dem ersten provoziert Linie der SerialEnd() Methode:

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

ich habe versucht, eine Antwort auf Fragen zu finden, aber ich habe nicht die richtige Lösung finden, vielleicht der Serializer ist geschlossen, aber ich habe nicht getan, noch

Dies ist, wie ich die XMLserializer im Fall erstellen Sie ein Problem hier sehen:

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: Ich habe einige Änderungen in den SerialEnd() gemacht Legen Sie den Abschluss der Datei in die finally- und unkommentierte EndDocument-Methode. Ich habe auch den Zugriff auf den Thread, der die XML-Datei erstellt, mit einer Synchronisierung auf die Erstellung der Absicht gesteuert, die die Erstellung der XML-Datei mit allen Polygonen steuert.

Antwort

0

Gelöst! Das Problem war, dass zwei XMLserializer erstellt wurden, die an derselben Datei arbeiteten. Ich habe geändert, wie der Dienst die Methode aufruft, jetzt benutze ich einen Hintergrund-Thread, um die Aufrufe zu machen, und ich kontrolliere die Ausführung mit einer Join(), so dass es immer nur eine Ausführung gibt.

Verwandte Themen