如何处理网络问题

Arn*_*aud 5 java android httpconnection android-networking android-volley

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

  • Volley大多数情况下的库
  • 的组合AsyncTask,并DefaultHttpClient为少数病例

大多数时候,一切都运作良好.但有时我会提出一系列网络异常,并将其展示给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;
}
Run Code Online (Sandbox Code Playgroud)

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

Fri*_*ent 0

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

这就是为什么在发出 HTTP 请求之前,您仍然需要通过向服务器或 Google 添加简单的 ping 来检查是否有互联网/可用的互联网(因为 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; 
}
Run Code Online (Sandbox Code Playgroud)

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

然而,继续处理异常,因为没有办法总是捕获它,并且有备用的处理方式不会有什么坏处