我有2个客户端连接到服务器,他们发送新坐标或生成新的圆圈,服务器更新圆圈的位置或创建新的圆圈并绘制它们。我使用延时5秒和5秒间隔的timertask来产生新的圆圈。
每次我在setTranslateX上运行应用程序时,我都会在随机索引处得到IndexOutOfBoundsException。
private void updateSimulation(ArrayList<String> cl) {
if(cl == translatedCoorsMessage) {
Platform.runLater(() -> {
int x= 1;
for(Circle circle : circlesOnCorridorOfClient) {
circle.setTranslateX(((Double.parseDouble(cl.get(x))) - 20.0)/1000);
x=x+2;
}
circlesOnCorridorOfClient.addAll(newCirclesToAddOnCorridor);
newCirclesToAddOnCorridor.clear();
});
}
else {
Platform.runLater(() -> {
int x= 1;
for(Circle circle : circlesOnCorridorOfClient1) {
circle.setTranslateX(((Double.parseDouble(cl.get(x))) - 967.0)/1000);
x=x+2;
}
circlesOnCorridorOfClient1.addAll(newCirclesToAddOnCorridor1);
newCirclesToAddOnCorridor1.clear();
});
}
}
这个错误可能发生在第二个圆圈产生后或第三个或第五个等等。我设置我的x = 1,因为我传递给这个方法的ArrayList中的第一个元素只是一个小字符串,知道我将用它做什么ArrayList。在这种情况下,请更新。第二个是X坐标,第三个是Y. 在我添加一个新的圆圈后,感觉就像foreach循环运行了一段时间。我只在循环后添加新的圆圈,并通过另一个arraylist进行。
任何提示都会被贬低。谢谢你的时间。
答案 0 :(得分:0)
我不确定,但我认为问题是我在Platform.runLater中所做的一切都发生在另一个线程(应用程序线程)中。所以我的服务器正在更新并添加新的圆圈(这个圆圈被添加到一个单独的ArrayList中以避免ConcurrentModificationException)然后我在更新每个圆圈位置后将我的新圆圈添加到主ArrayList。所以这就是问题,我有一个额外的圈子。
我&#34;修复&#34;通过在我的服务器中添加2个volatile变量来解决这个问题。我用这些整数来检查我是否在Platform.runLater中完成了所有操作。服务器保持在一个什么都不做的while循环中,只等到Platform.runLater部分完成并更改了这个整数的值,这样Server Thread可以在循环时退出并继续。 我不再得到IndexOutOfBoundsException了,除了&#34;动画&#34;真的很慢。
private void updateSimulation(ArrayList<String> cl) {
if(cl == translatedCoorsMessage) {
Platform.runLater(() -> {
int x= 1;
for(Circle circle : circlesOnCorridorOfClient) {
circle.setTranslateX(((Double.parseDouble(cl.get(x))) - 20.0)/1000);
x=x+2;
}
circlesOnCorridorOfClient.addAll(newCirclesToAddOnCorridor);
newCirclesToAddOnCorridor.clear();
testtest = 1;
});
while(testtest == 0){
//waiting
}
testtest = 0;
}
else {
Platform.runLater(() -> {
int x= 1;
for(Circle circle : circlesOnCorridorOfClient1) {
circle.setTranslateX(((Double.parseDouble(cl.get(x))) - 967.0)/1000);
x=x+2;
}
circlesOnCorridorOfClient1.addAll(newCirclesToAddOnCorridor1);
newCirclesToAddOnCorridor1.clear();
testtest1 = 1;
});
while(testtest1 == 0){
//waiting
}
testtest1=0;
}
}
是一个丑陋的解决方案。