我有一个连接到 Web 服务的应用程序。我可以使用 WIFI 或 3G 多次连接到 Web 服务而不会出现任何问题,前提是我在我的应用程序的生命周期中保持对我的连接类型的忠诚。那就是如果我不从 WIFI 切换到 3G。如果我从 WIFI 切换到 3G,我将无法再得到响应。我的连接一直在等待响应。
我尝试了以下 4 种情况。我只有第三种情况有问题。可能是什么问题?
第一种情况:连接始终处于 WIFI 状态(正常)
- 应用程序使用 WIFI 连接到网络服务。
- 已成功收到响应。
- 应用程序使用 WIFI 再次连接到网络服务。
- 响应已成功接收。
第二种情况:连接始终处于 3G 状态(正常)
- 应用程序使用 WIFI 连接到网络服务。
- 已成功收到响应。
- 应用程序使用 WIFI 再次连接到网络服务。
- 响应已成功接收。
第三种情况:连接从 WIFI 切换到 3G(无响应)
- 应用程序使用 WIFI 连接到网络服务。
- 已成功收到响应。
- 连接已切换到 3G。 WIFI 已禁用。已启用 3G。
- 应用程序使用 3G 再次连接到 Web 服务。
- 没有响应或收到错误。应用程序继续等待响应。在调用
getResponseCode
之前显示最后一个日志。
第 4 种情况:连接从 3G 切换到 WIFI(Ok)
- 应用程序使用 3G 连接到网络服务。
- 已成功收到响应。
- 连接已切换到 WIFI。 3G 已禁用。 WIFI 已启用。
- 应用程序使用 WIFI 再次连接到网络服务。
- 响应已成功接收。
我的猜测是默认情况下,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/