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

我有一个连接到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(好)

  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) { } 

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

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

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

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

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

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

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

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