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