所以这是一个很大的启示 - Android SDK似乎没有可靠的方法来检查互联网访问。
请允许我澄清一下。
Android文档&大多数在线样本使用类似于此处的方法:https://stackoverflow.com/a/4009133/980917
类似于:
public boolean isOnline() {
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnectedOrConnecting();
}
但是 - 这只是检查您是否连接到网络并且不保证您可以访问互联网。
对于那些不了解这一点的人来说,通过拔掉" IN"很容易重现。来自路由器的以太网电缆或连接到未连接到互联网的任何Wifi。
已知的工作方式:
1)尝试访问网站:https://stackoverflow.com/a/5803489/980917 这有问题,因为需要线程管理。
2)尝试ping Google的DNS:https://stackoverflow.com/a/27312494/980917 不需要包装在线程中但会冻结UI。
我在寻找:
理想情况下,我希望将Internet检查作为实用程序类中的一个简单静态方法,可以从UI或业务逻辑代码中调用。由于上面的解决方案,因此在调用者类中需要额外的开销来处理线程管理时,实际上并不能很好地工作。
有没有办法在Android中获得可靠的互联网检查,而不会使用线程管理代码来污染调用者类?
感谢。
答案 0 :(得分:1)
我做了一个带有一组静态方法的special class for this。众所周知,并在您的问题方法中显示,以检测网络是否可用。它还有一种方法来检查目标服务器/主机是否可通过此网络访问 - checkIsServerReachable()。但是,由于它是一个网络任务,它不能在UI线程上运行,所以这里唯一的方法是使用AsyncTask,Thread或回调。