Android 互联网检查(不是网络检查)

Android Internet Check (Not Network Check)

所以这是一个很大的启示 - Android SDK 似乎没有可靠的方法来检查互联网访问。

请允许我澄清一下。

Android 文档和大多数在线示例使用的方法类似于此处找到的方法:

类似于:

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

但是 - 这只是检查您是否已连接到网络,并不能保证您可以访问互联网。

对于那些不知道这一点的人,通过从路由器上拔下 "IN" 以太网电缆或连接到任何未连接到互联网的 Wifi 很容易重现。

已知解决方法:

1) 尝试访问网站: 这是有问题的,因为需要线程管理。

2) 尝试 ping Google 的 DNS: 不需要包裹在线程中但会冻结 UI.

我在找什么:

理想情况下,我希望将 Internet 检查作为实用程序 class 中的简单静态方法,可以从 UI 或业务逻辑代码中调用。因此,上述解决方案并不能很好地工作,因为调用者需要额外的开销 class 来处理线程管理。

有什么方法可以在 Android w/o 中使用线程管理代码污染调用者 class 进行可靠的互联网检查?

谢谢。

我用一组静态方法制作了一个 special class for this。它具有众所周知的问题方法并在您的问题方法中显示,以检测网络是否可用。它还具有检查目标 server/host 是否可通过此网络访问的方法 - checkIsServerReachable()。然而,由于它是一个网络任务,它不能在 UI 线程上 运行,所以这里唯一的方法是使用 AsyncTask、Thread 或回调。