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次执行。