在 Android 中检查互联网连接(功能比较)

Checking internet connection in Android (function comparison)

所以我正在比较下面我应该实现的两个功能中的哪一个。我知道有人检查 phone 是否已连接到互联网,还是检查您是否有一般连接?一个比另一个更好,一个比另一个做什么?他们做同样的事情吗?

函数 1:

public static boolean hasActiveInternetConnection(Context context) {
    if (isNetworkAvailable(context)) {
       try {
          HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
          urlc.setRequestProperty("User-Agent", "Test");
          urlc.setRequestProperty("Connection", "close");
          urlc.setConnectTimeout(1500); 
          urlc.connect();
          return (urlc.getResponseCode() == 200);
       } catch (IOException e) {
          Log.e(LOG_TAG, "Error checking internet connection", e);
       }
    } else {
       Log.d(LOG_TAG, "No network available!");
    }
    return false;
}

函数 2:

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
    = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null;
}

函数 2 具有更清晰的声明方式,您要求网络可用性而不是执行步骤来检查它(如函数 1 中)。 此外,Android 5.0 提供了新的多网络 API,可让您的应用动态扫描具有特定功能的可用网络,并与它们建立连接,请参阅 Wireless and Connectivity

我通常两者都用...就像你的情况一样 (isNetworkavailable && hasActiveInternetConnection)

第一种方法将检查是否存在连接(例如,如果 phone 处于飞行模式,将会有 none),如果这似乎有效,第二种方法检查是否实际上可以通过该连接接收到数据

我知道 facebook 推出了一个库来检查网络流量质量,你可以检查 github :

https://github.com/facebook/network-connection-class

我认为首先使用function2。如果成功调用 function1.;-)
Function2 将确保设备上存在某种连接。如果是,则 function2 将 ping 一些 uri,在此示例中为 google。它在设备可能连接到某些 wifi 但仍然无法连接等情况下很有用

有时可能出现的唯一问题是连接速度非常慢。即使连接可用,也可能会说没有连接可用

首先,函数1.需要权限

<uses-permission android:name="android.permission.INTERNET"/>

函数2.需要

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

函数 1.

  • 传输实际数据(错误)
  • 如果 DNS 服务器已死则无法工作
  • 如果 Google 关闭则不起作用(可能性很小,但不是 0%)
  • 在慢速移动网络上,可能需要很长时间才能收到响应(非常糟糕)

实际上,您应该只使用函数 2. 并正确处理对 YOUR server

的失败请求