3

我有一个连接到 Web 服务的应用程序。只要我在应用程序的生命周期内始终忠实于我的连接类型,我就可以使用 WIFI 或 3G 连接到 Web 服务任意次数而不会出现任何问题。那就是如果我不从WIFI切换到3G。如果我从 WIFI 切换到 3G,我将无法再得到响应。我的连接一直在等待响应。

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

第一种情况:连接始终在 WIFI 上(好的)

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

第二种情况:连接始终在 3G 上(好的)

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

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

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

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

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

我的猜测是默认情况下,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)
{

}
4

2 回答 2

2

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

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

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

于 2012-04-23T05:30:23.960 回答
1

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

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

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

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

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

于 2012-04-20T09:05:29.063 回答