单击我的应用程序中的按钮后,它会创建新的普通线程并开始下载大图像并将其保存到文件中。一切都很顺利,但是当我多次单击按钮时,它不会出现错误,当我尝试查看这些图像时,它们会被窃听,就像它们正在覆盖自己一样。
我不知道如何调试它。
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。第二次点击的图像将在几秒钟后保存。
最佳答案
按钮的单击事件的第一个操作应该是禁用按钮,并可能将文本更改为“处理中”。最后一个操作应该是重新启用按钮并恢复文本。
关于Java 在线程中保存大图像 - IP 摄像机图像损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25568509/