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

标签 java android wifi httpurlconnection 3g

我有一个连接到 Web 服务的应用程序。我可以使用 WIFI 或 3G 多次连接到 Web 服务而不会出现任何问题,前提是我在我的应用程序的生命周期中保持对我的连接类型的忠诚。那就是如果我不从 WIFI 切换到 3G。如果我从 WIFI 切换到 3G,我将无法再得到响应。我的连接一直在等待响应。

我尝试了以下 4 种情况。我只有第三种情况有问题。可能是什么问题?

第一种情况:连接始终处于 WIFI 状态(正常)

  1. 应用程序使用 WIFI 连接到网络服务。
  2. 已成功收到响应。
  3. 应用程序使用 WIFI 再次连接到网络服务。
  4. 响应已成功接收。

第二种情况:连接始终处于 3G 状态(正常)

  1. 应用程序使用 WIFI 连接到网络服务。
  2. 已成功收到响应。
  3. 应用程序使用 WIFI 再次连接到网络服务。
  4. 响应已成功接收。

第三种情况:连接从 WIFI 切换到 3G(无响应)

  1. 应用程序使用 WIFI 连接到网络服务。
  2. 已成功收到响应。
  3. 连接已切换到 3G。 WIFI 已禁用。已启用 3G。
  4. 应用程序使用 3G 再次连接到 Web 服务。
  5. 没有响应或收到错误。应用程序继续等待响应。在调用 getResponseCode 之前显示最后一个日志。

第 4 种情况:连接从 3G 切换到 WIFI(Ok)

  1. 应用程序使用 3G 连接到网络服务。
  2. 已成功收到响应。
  3. 连接已切换到 WIFI。 3G 已禁用。 WIFI 已启用。
  4. 应用程序使用 WIFI 再次连接到网络服务。
  5. 响应已成功接收。

我的猜测是默认情况下,HttpURLConnection 认为 WIFI 是比 3G 更好的连接类型。因此,当连接从 WIFI 切换到 3G 时,HttpURLConnection 拒绝确认 3G 并仍然尝试使用 WIFI 连接。另一方面,HttpURLConnection 允许从 3G 切换到 WIFI,因为 WIFI 是更好的连接类型。我对此是否正确?如果可以,我如何允许从 WIFI 切换到 3G?

下面是我的代码 fragment :(我每次连接到网络服务时都会调用它。)

//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 在我的应用程序上仍然表现不正常。

致其他人:如果您能提供更多解释,请不要犹豫编辑我的帖子。

关于java - 从 WiFi 连接切换到 3g 会导致连接挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10242942/

相关文章:

Java 无法将枚举用作注释的字符串参数(例如 : Jackson)

java - Android fragment 管理器不兼容的类型

android - 通过 Android 使用 radio 或其他信号跟踪手机在现实世界中的位置

Android:扫描 Wifi 网络 + 可选列表

windows-phone-7 - 如何在 WP7 上以编程方式打开/关闭 WiFi

java - 替换 Java 中的套接字底层 URL 连接

java - JBOSS AS 7 上的 SSL

java - 使用 PowerMock 时出现 ClassNotFoundException - Android Junit

java - 我应该在 Java 中用什么替换小结构?

java - 添加 ButterKnife 时找不到参数的方法 apt()