点击我的应用程序中的按钮后,它会创建新的普通线程并开始下载大图像并将其保存到文件中。一切都进展顺利,但是当我不止一次点击按钮时,它没有错误,当我试图查看这些图像时,它们就像他们重写自己一样被窃听。
我不知道如何调试它。
localPath = today + "/" + productCode + "/" + this.placeId; //Unique
/* ... */
private void productSave(String productCode, int whichCamera, boolean isError) {
for (int i = position; i < lastCamera; i++) {
Date dateSave = new Date();
path = localPath + "/" + dateFormat.format(dateSave) + "_" + (i + 1) + ".jpg";
try {
BufferedImage imageOld = ImageIO.read(new URL(this.camerasUrlsToSave[i]));
ImageIO.write(imageOld, "jpg", new File(rootPath + "/" + path));
ComDb.getInstance().saveProduct(productCode, this.placeId, path, dateSave);
} catch (IOException ex) {
result = false;
}
}
}
编辑:路径是100%唯一(带有产品代码的不同文件夹)。它不会出现相机图像问题 - 我可以打开10张卡片,我看不到图像错误
EDIT2:可以下载Img bufor吗?导致所有图像都从同一IP下载。或者它可能是bufferedimg内存泄漏的问题。需要了解如何修复它。
EDIT3:我发现如果我在网络浏览器中打开5张卡片,我的相机地址如下:blah.blah.some.ip / GetImage.cgi?CH = 0他们一个接一个地加载,而不是一次全部加载。但是,在下载结束时我没有看到错误的图像。
EDIT4:我尝试在网页浏览器中重现此错误,如果我尝试在ff和IE中打开链接。 IE打印“getImage busy”。当我尝试ff和chrome时,我得到了破碎的图像。所以我必须做像排队或禁用按钮......
EDIT5:我的临时解决方案:同步功能productSave。第二次点击的图像将在几秒钟后保存。
答案 0 :(得分:1)
按钮的click事件的第一个动作应该是禁用按钮,并可能将文本更改为“In process”。最后一个操作应该是重新启用按钮并恢复文本。
答案 1 :(得分:0)
这个答案是猜测,因为你没有给出完整的代码,问题可能是变量i - 它来自哪里?
或者可以重复使用相同的文件名,确保通过从单独的函数中获取唯一文件名来确定是这样的:
如果dateFormat仅为分钟或秒,则相同的文件名可能用于2个图像,使用此java.io.File API获取唯一名称
public static File createTempFile(String prefix, 字符串后缀, 文件目录)
//你可以传递extn作为jpg
public File getFileName(File localPath ,Date dateSave, int i, String extn){
File fileUniqe = File.createTempFile(dateSave + "_" + (i+1), extn, localPath );
return fileUniqe,
}