【问题标题】:Switching from WiFi connection to 3g causes connection to hang?从 WiFi 连接切换到 3g 会导致连接挂起?
【发布时间】:2012-04-20 08:43:11
【问题描述】:

我有一个连接到网络服务的应用程序。只要我在应用程序的生命周期内始终忠实于我的连接类型,我就可以使用 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(正常)

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

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

下面是我的代码的 sn-p:(我每次连接到 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)
{

}

【问题讨论】:

    标签: java android wifi httpurlconnection 3g


    【解决方案1】:

    我不知道为什么,但是在代码上添加System.setProperty("http.keepAlive", "false") 可以解决问题。

    根据 Android 开发者博客 (androids-http-clients),HttpURLConnection 在 Froyo 之前有一个错误,可以通过禁用连接池来解决,就像上面一样。但是,我使用的是 Gingerbread,所以我不确定为什么 HttpURLConnection 在我的应用程序上仍然表现不佳。

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

    【讨论】:

      【解决方案2】:

      当您在 wifi 上建立连接并切换回 3G 时,您是否看到任何连接断开异常?

      据我所知,如果您在 wifi 上打开连接,则该连接不能用于 3G。您需要拆除现有连接并在 3G 上重新建立新连接。

      我猜你的问题可能是因为你没有为你的请求设置任何连接超时,因此当连接断开时,HttpUrlConnection 需要很长时间才能意识到你的连接丢失。

      我已经将一些默认超时的 http 连接上的实用程序库放在一起,看看这是否对你有帮助

      https://github.com/nareshsvs/android-libraries

      【讨论】:

      • 谢谢,纳雷什!请注意,我的连接不会自动从 WiFi 切换到 3G。我在启用 3G 之前手动禁用了我的 WiFi。据我所知,我没有重复使用我以前的连接。我总是调用 httpsURLConnection = (HttpURLConnection) ((new URL(url)).openConnection());在连接到 Web 服务之前。因此,我的连接总是在尝试连接到 Web 服务之前更新。另外,如果我从 3G 切换到 WiFi,我仍然可以连接到网络服务。只有当我从 WiFi 切换到 3G 时它才不起作用。
      • 另一方面,调用 (HttpURLConnection) ((new URL(url)).openConnection()) 是否意味着我正在重新建立新连接?还是它仍然只通过不同的 URL 使用我的旧连接?
      • 是的..它建立了一个新的连接。另外我建议你在 android 中切换到 HttpClient,它比 HttpUrlCONnection 更有用和可配置
      • 谢谢! HttpClient 适用于 Eclair 和 Froyo,但 HttpURLConnection 是 Gingerbread 及更高版本的首选。虽然 HttpClient 更具可配置性,但 HttpURLConnection 更快。顺便说一句,我已经解决了我的问题。 :) System.setProperty("http.keepAlive", "false") 解决了它。我不知道为什么。
      猜你喜欢
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 2020-02-05
      • 2017-10-16
      • 1970-01-01
      相关资源
      最近更新 更多