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 或回调。
所以这是一个很大的启示 - 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 或回调。