【发布时间】:2014-10-23 11:30:04
【问题描述】:
在我的应用程序中单击一个按钮后,它会创建新的普通线程并开始下载大图像并将其保存到文件中。一切都很顺利,但是当我多次单击按钮时,它没有错误,当我尝试查看这些图像时,它们被窃听,就像它们重新覆盖自己一样。
我不知道如何调试它。
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 忙”。当我尝试 ff 和 chrome 时,我得到了损坏的图像。所以我必须做一些事情,比如排队或禁用按钮......
EDIT5:我的临时解决方案:同步函数 productSave。第二次点击的图像将在几秒钟后保存。
【问题讨论】:
-
变量 i 来自哪里?这是完整的代码吗?
-
@BCartolo 每个图像都有自己的文件。
-
@szymon Hab 如果用户多次单击该按钮,则该方法将使用相同的参数多次调用。我对吗?否则会给我们更多的上下文。
-
额外提示:创建一个新的 3000 x 3000
BufferedImageINT 类型将花费您 36000000 字节(并且需要一些时间来分配那个巨大的数组)。但它不会给你任何东西,因为下一行将覆盖。不过,这不是您的主要问题。
标签: java multithreading image overwrite