从WiFi连接切换到3g导致连接挂起?

我有一个连接到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仍然在我的应用程序中行为异常.

致他人:如果您可以提供更多解释,请随时编辑我的帖子.

上一篇:HttpURLConnection和okhttp的使用


下一篇:java – 404使用HttpUrlConnection访问Tomcat时,从浏览器访问200