当从3G切换到WiFi时,HttpClient超时了。

6

我进行了一些大型下载。当我连接3G开始下载时,一切正常。然后,我切换到WiFi连接,但请求返回超时异常。我使用了HttpClient库。我实现了重试机制,因此当请求返回异常时,它会等待0.5秒并尝试再次执行。我期望在连接到WiFi后,Http请求可以执行。但似乎Http execute方法始终返回null响应。非常奇怪,如果我再次切换回3G,execute方法仍然会返回一个良好的响应。有人可以帮帮我吗:)?


实际上,它返回的是Socket异常,而不是空响应。 - Muresan Catalin
2个回答

4

首先,对于大文件来说,使用DownloadManager可能更加方便-它可以处理重试和其他一切。

至于HttpClient-已知存在一些问题,但我不确定你是否遇到了其中之一或者只是忽略了某些东西。自Gingerbread以来,它已经被弃用,您可以尝试使用HttpUrlConnection代替,据说比HttpClient问题更少。

此外,在WIFI和蜂窝网络之间切换时,HttpClient可能需要完全重新初始化,这里有http range header告诉服务器从哪个字节继续下载。但同样,我建议您尝试使用DownloadManager,它可能会为您节省很多时间。


1
我的问题类似,但我不是下载大文件,只是小文件,当从3G切换到WiFi或反之时,我会收到异常。我也尝试了在每个请求后关闭连接管理器并重新创建httpclient,但仍然存在同样的问题。 - Niko
嗯,是的,WebView 也不能使用3G,这看起来比仅仅误用 HttpClient 更为严重。WebView 使用本地调用来加载 URL。嗯...只是为了确认-您的数据套餐中是否有3G可用? :) 您能否在aosp或第三方浏览器应用程序上通过3G加载任何内容?还有要检查的配置(接入点等)。 我猜设备可能认为它已连接到蜂窝网络,但实际流量可能不会通过如果AP不正确或您的运营商不允许3G。 - Ivan Bartsov
WebView能够使用3G加载页面,但如果先通过Wifi加载了某些内容,则无法加载。另外需要注意的是,在ICS中无法重现此问题,因此肯定是平台错误。 - Niko
好的,你必须想办法解决它。AOSP浏览器能很好地处理这种情况吗? - Ivan Bartsov
ICS运行良好,但旧设备不行,重新初始化/重启/销毁httpclient和manager也没有帮助。 - Niko
显示剩余3条评论

0
这可能是一个路由问题: 当在不同的网络类型之间切换时,通常本地IP地址以及更重要的是本地路由表会发生变化,因为使用了不同的网关。这意味着,如果它们发送相同的路线,那么在网络更改后,原本在客户端和服务器之间正常传输的数据包将无法到达任何目的地。很可能您的客户端实现需要被通知更改或者完全重新启动,以便重新初始化路由策略。
如果您使用的实现组件的文档没有透露任何信息,您可以尝试使用像Wireshark这样的数据包嗅探器来跟踪此问题。通常在Nirwhana中运行的数据包很容易在那里显示出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接