ArrayIndexOutOfBoundsException xmlserializer

问题描述:

我有一个代码,它使用XMLserializer创建一个kml文件。它可以很好地创建不同的多边形,但是我在关闭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();} 
    } 
} 

编辑:我已在SerialEnd()一些变化,把文件的关闭放在finally中,并且取消注释endDocument方法。我还控制了创建xml文件的线程的访问权限,同时创建了控制用所有多边形创建XML文件的意图。

解决!问题在于它创建了2个工作在相同文件上的XMLserializer。我改变了服务如何调用方法,现在我使用后台线程来调用,并使用join()来控制执行,因此一次只能执行1次执行。