繁体   English   中英

如何处理网络问题

[英]How to deal with network issues

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

  • 大多数情况下的图书馆Volley
  • 几种情况下AsyncTaskDefaultHttpClient组合

大多数时候,一切都运作良好。 但有时我会提出一系列网络异常,并将其展示给Crashlytics:

  • java.net.UnknownHostException: Unable to resolve host "mydomain.com": No address associated with hostname Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)

  • com.android.volley.ServerError at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:175) at 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,您可以连接到网络,但没有实际的互联网或可用的互联网。

这就是为什么你仍然需要通过向服务器或谷歌添加一个简单的ping来检查你是否有互联网/可用互联网,因为谷歌在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; 
}

您也可以使用其他方法,但一般的想法是相同的使用你知道几乎总是在线的东西,并检查你是否可以达到它。

但是要保持处理异常,因为没有办法总是抓住它并且备份处理事物的方式不会受到伤害

如何确保设备真正连接到互联网?

已经找到了。 这就是错误告诉你的。

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

我并不赞成这种事:

  • 如果它测试与实际请求完全相同的事情,则是(i)重复工作和(ii)不同时完成
  • 如果它没有测试与实际请求完全相同的东西,那么你可能会得到误报和漏报
  • 在所有情况下,它都是为了预测未来。 它现在可能会失败并且请求成功,或者现在成功并且请求失败。
  • 你必须为请求编写错误处理代码。

一般来说,测试任何资源是否可用的最佳方法只是尝试以正常方式使用它,并在它们出现时处理任何不利后果。

或者我应该放手,并假设每月达到几百个这样的警告是正常的?

我不会说ServerError是正常的。 服务器可能设法通过功能完备的网络将其发送给您,因此可能是您需要调查的服务器或客户端错误。 另一方面,网络中断在任何拓扑和技术中都是“正常的”。

是的,您应该在发出HTTP请求之前检查互联网可用性,这为您节省了很多。

您应该使用的代码非常好,并且比“ping”任何域都要好得多。

但仍然在你的情况下你的条件是不够的,因为适配器实际上是连接的,但由于连接不良,你可能无法连接到你的服务器。

因此,您仍应处理执行请求时可能发生的超时和IO异常。

- 为你的Httpclient设置超时 - 我认为凌空默认有超时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM