我有一个应用程序连接到一个 web 服务。只要在应用程序生命周期内保持连接类型的一致性,使用 WIFI 或 3G 都可以无限次数地连接到 web 服务而不会出现任何问题。也就是说,如果我没有从 WIFI 切换到 3G,则没有问题。但如果我从 WIFI 切换到 3G,就再也收不到响应了。我的连接一直在等待响应。
我尝试了以下 4 种情况。只有第三种情况出现了问题。这可能是什么原因呢?
1. 连接始终使用 WIFI(正常) 1. 应用程序使用 WIFI 连接到 web 服务。 2. 成功接收到响应。 3. 应用程序再次使用 WIFI 连接到 web 服务。 4. 成功接收到响应。
2. 连接始终使用 3G(正常) 1. 应用程序使用 WIFI 连接到 web 服务。 2. 成功接收到响应。 3. 应用程序再次使用 WIFI 连接到 web 服务。 4. 成功接收到响应。
3. 连接从 WIFI 切换到 3G(没有响应) 1. 应用程序使用 WIFI 连接到 web 服务。 2. 成功接收到响应。 3. 连接切换到 3G。WIFI 被禁用,3G 被启用。 4. 应用程序使用 3G 再次连接到 web 服务。 5. 没有收到响应或错误。应用程序一直在等待响应。在调用 getResponseCode 之前显示了最后一个日志。
4. 连接从 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 服务时都会调用它)。
我尝试了以下 4 种情况。只有第三种情况出现了问题。这可能是什么原因呢?
1. 连接始终使用 WIFI(正常) 1. 应用程序使用 WIFI 连接到 web 服务。 2. 成功接收到响应。 3. 应用程序再次使用 WIFI 连接到 web 服务。 4. 成功接收到响应。
2. 连接始终使用 3G(正常) 1. 应用程序使用 WIFI 连接到 web 服务。 2. 成功接收到响应。 3. 应用程序再次使用 WIFI 连接到 web 服务。 4. 成功接收到响应。
3. 连接从 WIFI 切换到 3G(没有响应) 1. 应用程序使用 WIFI 连接到 web 服务。 2. 成功接收到响应。 3. 连接切换到 3G。WIFI 被禁用,3G 被启用。 4. 应用程序使用 3G 再次连接到 web 服务。 5. 没有收到响应或错误。应用程序一直在等待响应。在调用 getResponseCode 之前显示了最后一个日志。
4. 连接从 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)
{
}