Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 阿帕奇';s HttpClient在Swing应用程序中休眠_Java_Apache_Swing_Httpclient_Jsr296 - Fatal编程技术网

Java 阿帕奇';s HttpClient在Swing应用程序中休眠

Java 阿帕奇';s HttpClient在Swing应用程序中休眠,java,apache,swing,httpclient,jsr296,Java,Apache,Swing,Httpclient,Jsr296,我面临着非常奇怪的问题。编写一个应用程序,通过代理服务器支持从Internet下载一些数据,我决定使用Apache的HttpClient库。jar二进制文件已成功添加到NetBeans项目,并且在一个简单的应用程序中(也成功)执行了以下代码段: DefaultHttpClient httpclient = new DefaultHttpClient(); String proxyHost = "192.168.4.10"; Integer proxyPort = 8080; HttpHost

我面临着非常奇怪的问题。编写一个应用程序,通过代理服务器支持从Internet下载一些数据,我决定使用Apache的HttpClient库。jar二进制文件已成功添加到NetBeans项目,并且在一个简单的应用程序中(也成功)执行了以下代码段:

DefaultHttpClient httpclient = new DefaultHttpClient();
String proxyHost = "192.168.4.10";
Integer proxyPort = 8080;

HttpHost targetHost = new HttpHost("noaasis.noaa.gov", 80, "http");
HttpGet httpget = new HttpGet("/ptbus/ptbus167");

try {

    HttpHost proxy = new HttpHost(proxyHost, proxyPort);
    httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);

    System.out.println("executing request: " + httpget.getRequestLine());
    System.out.println("via proxy: " + proxy);
    System.out.println("to target: " + targetHost);

    HttpResponse response = httpclient.execute(targetHost, httpget);
    HttpEntity entity = response.getEntity();

    System.out.println("----------------------------------------");
    System.out.println(response.getStatusLine());
    Header[] headers = response.getAllHeaders();
    for (int i = 0; i<headers.length; i++) {
        System.out.println(headers[i]);
    }

    System.out.println("----------------------------------------");
    System.out.println(response.getStatusLine());
    if (entity != null) {
        System.out.println("Response content length: " + entity.getContentLength());
    }
    EntityUtils.consume(entity);

}
catch (IOException ex) {

}
finally {
    // When HttpClient instance is no longer needed,
    // shut down the connection manager to ensure
    // immediate deallocation of all system resources
    httpclient.getConnectionManager().shutdown();
}
导致应用程序的执行在中的某个位置停止

HttpResponse response = httpclient.execute(targetHost, httpget);
至少,它永远不会回来

有趣的是,如果在创建任何Swing实例之前,我也将此代码片段放在应用程序的main方法中,则会传递所提到的行并接收HTTP响应。调用showAboutBox()也不会再引起问题-我也会收到HTTP响应

我做错了什么,伙计们?有什么诀窍?我可以在Swing应用程序中使用Apache的库吗?我无法理解发生了什么,也没有发现任何类似的事情,比如在网上花费数小时


谢谢大家的关注。希望得到任何帮助

您正在阻止(EDT)。使用,如图所示。

您正在阻止(EDT)。使用,如图所示。

仅允许注释,但其长度超过允许的字符数

为了避免错误的方向,基于Swing的gui不关心您运行任何后台任务,Swing是单线程的,所有到gui的输出都必须在EDT上完成

1/将GUI的输出包装到SwingUtilities.invokeLater(),该文件创建了您自己的EDT,如果存在EDT,则将实际任务移动到EDT的末尾

2/使用javax.swing.Action将输出包装到GUI


3/或者像垃圾神建议的那样,让我们的SwingWorker为+1工作,它只提供评论,但超过了允许的字符数

为了避免错误的方向,基于Swing的gui不关心您运行任何后台任务,Swing是单线程的,所有到gui的输出都必须在EDT上完成

1/将GUI的输出包装到SwingUtilities.invokeLater(),该文件创建了您自己的EDT,如果存在EDT,则将实际任务移动到EDT的末尾

2/使用javax.swing.Action将输出包装到GUI


3/或者像垃圾神建议的那样,让我们的SwingWorker为+1工作

我通过排除
org.jdesktop.application.SingleFrameApplication
并用
JFrame
替换
FrameView
,解决了这个问题。当然,我们失去了
FrameView
的优势,但所有必需的东西都可以通过扩展
JFrame
来实现

不幸的是,我没有足够的时间来研究为什么
HttpClient
不能与
SingleFrameApplication
一起工作,所以建议的解决方案对我来说是可以接受的

希望这能帮助别人


感谢垃圾神和mKorbel的参与。谢谢大家。两个+1.

我通过排除
org.jdesktop.application.SingleFrameApplication
并用
JFrame
替换
FrameView
解决了这个问题。当然,我们失去了
FrameView
的优势,但所有必需的东西都可以通过扩展
JFrame
来实现

不幸的是,我没有足够的时间来研究为什么
HttpClient
不能与
SingleFrameApplication
一起工作,所以建议的解决方案对我来说是可以接受的

希望这能帮助别人


感谢垃圾神和mKorbel的参与。谢谢大家。两者都是+1。

这是a吗?是的,是。但在我的应用程序中,由NetBeans生成的GUI表单被使用的手写代码所取代。只剩下扩展SingleFrameApplication的主类。确定。我添加了
jsr296
标记,以防相关。这是a吗?是的,它是。但在我的应用程序中,由NetBeans生成的GUI表单被使用的手写代码所取代。只剩下扩展SingleFrameApplication的主类。确定。我添加了
jsr296
标记,以防相关。你好,垃圾神。谢谢你的回复。。。当我为下载任务创建单独的线程时,如何阻止事件分派线程?(
SwingUtilities.isEventDispatchThread()
返回
false
)。将此代码放在SwingWorker的
doInBackground()
方法中会得到相同的结果。也许,我必须更加精确——我可以操纵GUI控件,但我运行的线程永远不会返回(我可以在调试窗口中看到它)。调用
showAboutBox()
几次后,我几乎没有“睡眠”线程。Hmmn,如果遇到异常,EDT将自动重新启动。有没有可能被吞下?有什么线索吗?另见。抱歉给你带来了误会,嗨,垃圾神。我在输出中没有任何异常,我仍然无法理解这个非EDT如何影响EDT。对不起,我对
jsr296
HttpClient
了解不够,无法解释它为什么会阻塞。如果它正在另一个线程上运行,请确保在更新GUI时使用
invokeLater()
。您好,垃圾神。谢谢你的回复。。。当我为下载任务创建单独的线程时,如何阻止事件分派线程?(
SwingUtilities.isEventDispatchThread()
返回
false
)。将此代码放在SwingWorker的
doInBackground()
方法中会得到相同的结果。也许,我必须更加精确——我可以操纵GUI控件,但我运行的线程永远不会返回(我可以在调试窗口中看到它)。调用
showAboutBox()
几次后,我几乎没有“睡眠”线程。Hmmn,如果遇到异常,EDT将自动重新启动。有没有可能被吞下?有什么线索吗?另见。抱歉给你带来了误会,嗨,垃圾神。我在输出中没有任何异常,我仍然无法理解这个非EDT如何影响EDT。对不起,我对
jsr296
HttpClient
了解不够,无法解释它为什么会阻塞。如果它正在另一个线程上运行,请确保在更新GUI时使用
invokeLater()
HttpResponse response = httpclient.execute(targetHost, httpget);