2013-03-04 30 views
2

我在URLConnection类中遇到getInputStream方法的问题。我知道在其他线程中讨论过一些其他类似的问题,但没有单一的解决方案似乎在我的情况下工作。URLConnection getInputStream块线程

有趣的是,随着第一次执行顺利,进一步失败(块)。在描述这个问题之前,我想写一些背景知识。这里是。

基本上我有简单的客户端服务器配置。由于我不想在客户端应用程序中硬编码服务器地址和端口,我使用HTTP服务器(nginx),从中可以检索实际的连接参数。

在客户端,有一个'网络线程',由服务控制。服务启动线程并在需要时中断它。在run()方法的最开始有下列函数的调用:

private ConnectionParameters obtainConnectionParameters(String url) throws MalformedURLException, IOException { 
    URLConnection connection = new URL(url).openConnection(); 
    InputStream in = connection.getInputStream(); // here the problem occurs 

    ... // do some processing 

    in.close();  
    return connectionParameters; 
} 

当得到连接参数,另一个套接字连接被打开。经过一段时间线程可能会关闭或者只是到达run()方法的末尾。我仔细检查它是否干净地退出。

回到问题,我不知道是什么可能导致这种情况发生。你有什么线索可能导致这种行为?

我还想提一下,服务和网络线程在活动的独立(后台)过程中运行。在此过程中没有其他地方使用URLConnection。值得注意的是,方法obtainConnectionParameters中使用的所有变量都是本地的。

我想在说明中没有什么关键性的东西没有。否则,请让我知道,所以我可以编辑我的帖子。

EDIT(1):

我刚才想的Apache HTTP客户端在线程Make an HTTP request with android ,效果不错。不过,我想知道URLConnection有什么问题。

回答

0

如果我的理解正确,上面的代码片段被多次调用,并且第一次工作正常,但第二次阻塞getInputStream()调用?

问题可能出现在服务器端。也许服务器一次只接受一个连接,并且您所做的第一个连接仍处于打开状态?是否可以多次使用浏览器打开网址,以验证服务器是否按预期工作?

+0

这是我第一次尝试解决这个问题,但服务器似乎工作正常。我在'nginx' conf文件中没有任何魔力,并且我检查了多个页面刷新(Shift + Ctrl + R)的多个页面。一切按预期工作。 – stilz 2013-03-04 20:32:46

+0

您是否正在读取完整输入流,直到没有更多字节可用(-1)? – Tom 2013-03-04 20:51:58

+0

我使用下面的循环:'while((line = reader.readLine())!= null)',所以我想我读'直到EOF。如我错了请纠正我。阅读器构造如下。 'BufferedReader reader = new BufferedReader(new InputStreamReader(is,“UTF-8”));' – stilz 2013-03-04 21:15:56