我有一个连接到Web服务的应用程序。我可以使用WIFI或3G连接到Web服务,没有任何问题,只要我在应用程序的生命周期内保持忠诚于我的连接类型。那就是我不从WIFI切换到3G。如果我从WIFI切换到3G,我再也无法得到响应。我的联系一直在等待回应。
我在下面尝试了4个场景。我只对第三种情况有问题。可能是什么问题?
第一种情景:连接始终在WIFI上(确定)
第二种场景:连接始终在3G(确定)
第3种情况:连接从WIFI切换到3G(无响应)
getResponseCode
之前显示了上次日志。第4种情况:连接从3G切换到WIFI(确定)
我的猜测是默认情况下,HttpURLConnection
认为WIFI是一种比3G更好的连接类型。因此,当连接从WIFI切换到3G时,HttpURLConnection
拒绝确认3G并仍尝试使用WIFI进行连接。另一方面,HttpURLConnection
允许从3G切换到WIFI,因为WIFI是更好的连接类型。我对此是否正确?如果是这样,我如何允许从WIFI切换到3G?
下面是我的代码片段:(我每次连接到Web服务时都会调用它。)
//open new connection
httpsURLConnection = (HttpURLConnection) ((new URL(url)).openConnection());
httpsURLConnection.setDoInput(isDoInput);
httpsURLConnection.setDoOutput(isDoOutput);
try
{
//supply parameters
OutputStreamWriter wr = new OutputStreamWriter(httpsURLConnection.getOutputStream());
wr.write(data);
wr.flush();
if(httpURLConnection != null)
{
if (httpsURLConnection.getResponseCode() == HttpsURLConnection.HTTP_OK) //connection hangs here
{
//some code
}
else
{
//some code
}
}
}catch(Exception e)
{
}
答案 0 :(得分:2)
我不确定为什么,但在代码上添加System.setProperty("http.keepAlive", "false")
可以解决问题。
根据Android开发者博客(androids-http-clients),HttpURLConnection
在Froyo之前有一个错误,可以通过禁用连接池来解决,就像上面一样。但是,我正在使用姜饼,所以我不确定为什么HttpURLConnection在我的应用程序上仍然行为不端。
致其他人:如果您能提供更多解释,请随时编辑我的帖子。
答案 1 :(得分:1)
当您在wifi上建立连接并切换回3G时,您是否看到任何连接丢弃异常?
据我所知,如果您在wifi上打开连接,则相同的连接不能用于3G。您需要拆除现有连接并在3G上重新建立新连接。
我猜你的问题可能是因为你没有为你的请求设置任何连接超时,因此当连接丢失时,HttpUrlConnection需要很长时间来实现你的连接丢失。
我已经在http连接上放置了一些默认超时的实用程序库,看看这是否可以帮助你