我有一个连接到Web服务的应用程序.只要我在应用程序的生命周期内忠于自己的连接类型,就可以使用WIFI或3G多次连接到Web服务,而不会出现任何问题.那就是如果我不从WIFI切换到3G.如果我从WIFI切换到3G,将无法再获得响应.我的连接一直在等待响应.
我在下面尝试了4种情况.我只对第三种情况有疑问.可能是什么问题呢?
第一种情况:连接始终在WIFI上(确定)
>应用程序使用WIFI连接到Web服务.
>已成功收到响应.
>应用程序再次使用WIFI连接到Web服务.
>响应已成功接收.
第二种情况:连接始终在3G上(确定)
>应用程序使用WIFI连接到Web服务.
>已成功收到响应.
>应用程序再次使用WIFI连接到Web服务.
>响应已成功接收.
第三种情况:连接从WIFI切换到3G(无响应)
>应用程序使用WIFI连接到Web服务.
>已成功收到响应.
>连接已切换到3G. WIFI已禁用. 3G已启用.
>应用程序再次使用3G连接到Web服务.
>没有收到响应或错误.应用程序继续等待响应.在调用getResponseCode之前显示了最后一个日志.
第四种情况:连接从3G切换到WIFI(确定)
>应用程序使用3G连接到Web服务.
>已成功收到响应.
>连接已切换为WIFI. 3G已禁用. WIFI已启用.
>应用程序再次使用WIFI连接到Web服务.
>响应已成功接收.
我的猜测是默认情况下,HttpURLConnection认为WIFI是比3G更好的连接类型.因此,当连接从WIFI切换到3G时,HttpURLConnection拒绝确认3G并仍尝试使用WIFI进行连接.另一方面,由于WIFI是更好的连接类型,因此HttpURLConnection允许从3G切换到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)
{
}
解决方法:
我不知道为什么,但是在代码上添加System.setProperty(“ http.keepAlive”,“ false”)可以解决问题.
根据Android开发者博客(androids-http-clients)的说法,HttpURLConnection在Froyo之前存在一个错误,可以通过禁用连接池来解决,就像上面一样.但是,我使用的是Gingerbread,所以我不确定为什么HttpURLConnection仍然在我的应用程序中行为异常.
致他人:如果您可以提供更多解释,请随时编辑我的帖子.