【问题标题】:ImageIO.read(URL) taking longImageIO.read(URL) 需要很长时间
【发布时间】:2012-07-13 13:56:15
【问题描述】:

好的,所以我正在尝试从 URL 读取图像,但它并没有真正做任何事情。 这是我用来从 URL 检索图像的方法:

    public Image getImage(String url){
    try{
        System.out.println("gettingImage");
        return ImageIO.read(new URL(url));
    }catch(Exception e){
        e.printStackTrace();
        return null;
    }
}

我添加了一个 System.out.println() 只是为了确保在我调用它时该方法正在实际执行。

我传递给它的网址是:http://i3.kym-cdn.com/photos/images/masonry/000/349/917/065.png(这是一个有效的网址)

我的输出是这样的:

gettingImage

它只是说'gettingImage'(来自我添加的 System.out.println())并且由于某种原因实际上并没有得到图像。没有堆栈跟踪,只有那个输出。任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 你的函数返回什么?空?
  • 我的函数应该返回该图像。如果它返回 null,我会知道由于“e.printStackTrace()”
  • 你怎么知道它没有得到图像?您的代码没有显示 getImage 的调用者...
  • @Josh:错了,请看这里:docs.oracle.com/javase/6/docs/api/javax/imageio/…
  • 您应该从新线程调用该方法,因为它是阻塞方法。或者更好地使用SwingWorker

标签: java image swing javax.imageio imageicon


【解决方案1】:

你不应该调用一个需要很长时间才能从主线程内部返回的密集方法,这会冻结你的 GUI。创建一个新的SwingWorker 并在其中调用该方法。看到这个example

【讨论】:

  • @Eng:我的意思是,我不确定这是否与基于 Swing 的用户界面有关——它也可能与无头服务器端应用程序有关...跨度>
  • 不管它是否是线程的,它似乎都不会检索图像。我知道,如果它没有线程化,它将暂时冻结我的 GUI(由于占用了程序运行所在的主线程),但这只是暂时的。我试过把它放在一个线程中,这样它就不会冻结我的 GUI,也没有任何区别。
  • @home 在他编辑之前我在OP's comment 上看到了ImageIcon :)
  • @Eng:抱歉,我没有查看历史记录 - 忘记我的评论 :-)
  • 你们知道为什么它没有得到图像吗?
【解决方案2】:

试试这个....

这个程序只是为了显示图像被获取,我只是在上面使用System.out 从url返回图片,证明图片是获取到的。

我还使用了一个线程,以便处理密集型工作不在负责 UI 的EDT (Event Dispatcher Thread) 之外。

您必须使用 Thread 或 SwingWorker,否则在 EDT 上执行进程密集型工作最终会使您的 GUI 无响应...

public class UrlTest
{
    public static void main(String[] args)
    {
        new Thread (new Runnable()
        {
            @Override public void run()
            {
                try
                {
                    URL url = new URL("http://i3.kym-cdn.com/photos/images/masonry/000/349/917/065.png");
                    Image img = ImageIO.read(url);
                    System.out.println(img);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

【讨论】:

  • 我稍微改变了布局,我有一个完整的图像 URL 列表,基本上我只是在 url 列表中循环,然后在线程内以这种方式获取图像。这是我到控制台的输出:paste.strictfp.com/29840 如您所知,它在 ~4 之后停止获取图像,即使有更多的 URL。所有 URL 都是有效的 URL,但它似乎只是停止获取图像。我觉得每次运行它,我都会得到不同的结果......我不知道问题是什么。
  • 没关系...那么现在有什么问题.. ??
  • 虽然不好,在~4个网址之后就停止获取图片了,我不明白。
  • 您的 GUI 是否反应迟钝?
  • 不,它在一个单独的线程中。似乎每次运行它时,我都会得到不同的结果;它只能获得几个图像,但不是全部。而当它无法获取图像时,它甚至不会转到下一个图像,它只会停在那里。
【解决方案3】:

找到了为什么这不起作用的问题:这与我的代码无关,这是因为我的互联网在瞬间闪烁,并且无法从那个小闪烁中恢复。我不知道我的互联网一直在闪烁,但我想这是因为当我将它发送给我的一位朋友时,它在他的电脑上运行良好,所以一定是由于互联网连接。感谢您的所有想法。

【讨论】:

    猜你喜欢
    • 2013-09-07
    • 2020-08-26
    • 2014-10-09
    • 2012-11-26
    • 2019-12-27
    • 2017-10-22
    • 2020-11-15
    • 2016-05-19
    • 2011-11-20
    相关资源
    最近更新 更多