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

时间:2012-04-20 08:43:12

标签: java android wifi httpurlconnection 3g

我有一个连接到Web服务的应用程序。我可以使用WIFI或3G连接到Web服务,没有任何问题,只要我在应用程序的生命周期内保持忠诚于我的连接类型。那就是我不从WIFI切换到3G。如果我从WIFI切换到3G,我再也无法得到响应。我的联系一直在等待回应。

我在下面尝试了4个场景。我只对第三种情况有问题。可能是什么问题?

第一种情景:连接始终在WIFI上(确定)

  1. 应用程序使用WIFI连接到Web服务。
  2. 已成功收到回应。
  3. 应用程序使用WIFI再次连接到Web服务。
  4. 回应已成功收到。
  5. 第二种场景:连接始终在3G(确定)

    1. 应用程序使用WIFI连接到Web服务。
    2. 已成功收到回应。
    3. 应用程序使用WIFI再次连接到Web服务。
    4. 回应已成功收到。
    5. 第3种情况:连接从WIFI切换到3G(无响应)

      1. 应用程序使用WIFI连接到Web服务。
      2. 已成功收到回应。
      3. 连接已切换到3G。 WIFI已禁用。 3G已启用。
      4. 应用程序再次使用3G连接到Web服务。
      5. 没有收到回复或错误。应用程序一直等待响应。在调用getResponseCode之前显示了上次日志。
      6. 第4种情况:连接从3G切换到WIFI(确定)

        1. 应用程序使用3G连接到Web服务。
        2. 已成功收到回应。
        3. 连接已切换为WIFI。 3G被禁用。 WIFI已启用。
        4. 应用程序使用WIFI再次连接到Web服务。
        5. 回应已成功收到。
        6. 我的猜测是默认情况下,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)
          {
          
          }
          

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

我猜你的问题可能是因为你没有为你的请求设置任何连接超时,因此当连接丢失时,HttpUrlConnection需要很长时间来实现你的连接丢失。

我已经在http连接上放置了一些默认超时的实用程序库,看看这是否可以帮助你

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