gpt4 book ai didi

java - 如何处理网络问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:07 26 4
gpt4 key购买 nike

我的一个应用程序使用大量 HTTP 请求与其后端通信。我使用 2 种不同的实现来执行这些请求:

  • 图书馆 Volley 大多数情况
  • AsyncTaskDefaultHttpClient 的组合用于少数情况

大多数时候,一切正常。但有时我会引发一堆网络异常并显示在 Crashlytics 中:

  • java.net.UnknownHostException:无法解析主机“mydomain.com”:没有与主机名关联的地址
    由以下原因引起:libcore.io.GaiException:getaddrinfo 失败:EAI_NODATA(没有与主机名关联的地址)

  • com.android.volley.ServerError
    在 com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:175)
    在 com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:110)

通过一些研究,我发现当设备的 3g/4g 非常糟糕或处于 VPN/子网后无法访问我的网站时,这应该会发生。

如何确保设备真正连接到互联网?只有当此函数返回 true 时,我才实际执行这些请求:

public static boolean isOnline(Context ctx) {
ConnectivityManager cm = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}

或者我应该放手并假设每月收到数百个此类警告是正常的?

最佳答案

为了查看您是否有互联网,您需要做的不仅仅是检查您是否有网络连接。因为如果您连接到慢速网络、强制门户或 VPN,您可以连接到网络,但没有实际的互联网或可用的互联网。

这就是为什么您仍然需要在通过向服务器或 Google 添加一个简单的 ping 来发出 HTTP 请求之前检查您是否有互联网/可用的互联网(因为 Google 在 99.99% 的时间里都是在线的)。您也可以定期执行此操作,或者在捕获到第一个异常时执行此操作,这由您决定。

public Boolean isInternet() {
try {
Process process = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = process.waitFor();
boolean reachable = (returnVal==0);
return reachable
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}

您也可以使用另一种方法,但总体思路是相同的,使用您知道几乎总是在线的东西并检查您是否可以访问它。

但是继续处理异常,因为没有办法总是捕获它并且有一个处理事情的备用方法不会有坏处

关于java - 如何处理网络问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26968864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com