2014-08-29 77 views
0

点击我的应用程序中的按钮后,它会创建新的正常线程并开始下载大图像并将其保存到文件。一切都很顺利,但是当我单击按钮不止一次它没有错误,当我尝试查看这些图像时,他们像他们重写自己一样被窃听。Java在线程中保存大图像-IP摄像机破碎的图像

我不知道如何调试它。

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内存泄漏的问题。需要想法如何修复它。编辑3:我发现如果我在我的相机地址如:blah.blah.some.ip/GetImage.cgi?CH = 0在网络浏览器中打开5张卡片,他们一个接一个地加载,而不是全部一旦。但是,当下载结束时,我没有看到窃听图像。编辑4:我试图在网页浏览器中重现此错误,如果我尝试在ff和IE中打开链接。 IE打印出“getImage busy”。当我尝试使用ff和chrome时,我得到了破碎的图像。所以我必须像排队或禁用按钮......

EDIT5:我的临时解决方案:同步功能productSave。第二次点击后的图像将在几秒钟后保存。

http://oi57.tinypic.com/ofrrn.jpg

One from saved Images

+0

其中变量i是从哪里来的?这是完整的代码吗? – tgkprog 2014-08-29 12:42:57

+1

[Threads and file writing]的可能重复(http://stackoverflow.com/questions/9972549/threads-and-file-writing) – BCartolo 2014-08-29 12:45:52

+0

@BCartolo每张图片都有自己的文件。 – 2014-08-29 12:56:00

回答

1

按钮的点击事件的第一个动作应该是禁用按钮,也许文本更改为“处理中”。最后的动作应该是重新启用按钮并恢复文本。

+0

那么使用线程有什么意义?只保留变量分开 – tgkprog 2014-08-29 12:50:02

+0

重点不在于屏蔽GUI线程。 http://blogs.planetsoftware.com.au/paul/archive/2010/12/05/waiting-for-a-task-donrsquot-block-the-main-ui-thread.aspx – BCartolo 2014-08-29 12:53:35

+0

我无法禁用按钮因为人们必须有可能保存下一个图像,即使前一个还没有下载 – 2014-08-29 13:05:25

0

这个答案是一个猜测,因为你没有给出完整的代码,问题可能与变量我 - 它从哪里来?

或者可能是同一个文件名被重用,mnake肯定是n要的情况下,由一个单独的功能,这样的事情越来越唯一的文件名:

如果日期格式为只到分,秒,相同的文件名可以用于2个图像使用java.io.File中的这个API获得一个唯一的名称

http://docs.oracle.com/javase/7/docs/api/java/io/File.html#createTempFile%28java.lang.String,%20java.lang.String,%20java.io.File%29

公共静态文件createTempFile(字符串前缀, 字符串后缀, 文件目录)

//你可以通过分机为JPG

public File getFileName(File localPath ,Date dateSave, int i, String extn){ 
    File fileUniqe = File.createTempFile(dateSave + "_" + (i+1), extn, localPath); 
    return fileUniqe, 
} 
+0

因此我是一个局部变量,仍然使用上面的函数来获得一个唯一的文件名 – tgkprog 2014-08-29 12:50:53

+0

更新的代码,即时通讯已经调试,它不是一个问题与文件名 - 它的100%唯一性,因为localpath指出当前产品代码 – 2014-08-29 12:52:02

+0

尝试此操作有什么危害? – tgkprog 2014-08-29 20:37:43