public boolean isNetworkConnected() {
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}
每当我的互联网连接或断开连接时,此功能都能正常工作。但有一种情况是我的互联网连接但由于互联网上的一些问题我们无法交换数据包或你可以说无法浏览。即使在那种状态下,我从这个函数中得到true
,而我只想在我的互联网完全正常工作时返回true
。
在这种情况下我该怎么办?感谢。
答案 0 :(得分:1)
您可以尝试使用HTTP Get to google.com或其他具有高正常运行时间的网站。
答案 1 :(得分:1)
在这种情况下,唯一可靠的方法是下载一个小的已知文件并验证其完整性。需要这种情况的一个案例是开放式咖啡馆。任何人都可以连接到他们,但所有网络请求都会被重定向到他们的“网关”,直到您接受他们的条款和条件。
答案 2 :(得分:1)
是的,它发生在少数情况下,如http超时异常,因为可能存在网络连接但没有实际的互联网连接的情况,因为访问它的唯一方法是通过VPN,这样你就有了另外,另一个例如,WI-FI连接可用但由于ISP的某些问题没有实际的互联网流量。
我建议你看看this线程解释,如何做http请求并找出互联网可用性。
答案 3 :(得分:1)
没有办法以编程方式获取您正在寻找的信息。
如果存在“互联网连接问题”,例如刚刚进入死区的蜂窝数据连接非常常见,您将看到蜂窝链路保持建立几秒钟,直到超时为止。在此等待期间,链路层仍然认为它已连接但没有数据包可以通过,您唯一能做的就是开始等待自己 - 并选择一个小于或等于链路层超时值的任意超时值。
由于基于超时的连接是基于等待任意时间段然后决定您是否认为数据包将要到达,因此没有通用的解决方案来确定 - 如果没有阻止 - 连接会成功。毕竟,仅仅因为之前发送的数据包通过,并不意味着连接无法立即被杀死。
我不同意尝试从某个地方的URL获取小资源的测试。该测试存在问题,因为它涉及阻止,这将减慢您的程序。如果程序实际尝试发送的数据包能够在链接层或协议层超时之前完成,那么您将获得结果。如果数据包无法通过,您将无法获得结果。就这么简单。
互联网连接是一种“瞬态”现象:无法确定它是否可以提前使用。它就在那里瞬间消失了。就像磁盘上存在一个文件一样。而不是试图根据互联网连接改变程序逻辑的流程,而应该反应到连接明显不可用的情况,例如数据包没有通过,或者你没有没有得到响应,或者网络接口声明它已关闭(实质上是你正在调用的Android API正在做什么)。处理例外情况;不要试图确定它是否已经完成然后再做一些事情。
总之,isNetworkConnected()
函数的概念大多没有意义,除了简单测试链接层是否认为它已连接(至少,这可以节省您的时间和精力,因为没有链接层显然暗示连接已知不可用,而所有其他故障状态涉及未知数,直到检测到问题后实验上。)问题是即使是isNetworkConnected()
实现中对网络可用性的最可靠和严格的测试也不能原子地保证在isNetworkConnected()
函数返回的时间和开始尝试的时间之间。上传/下载实际数据,结果没有改变。它基本上是一种无法解决的竞争条件,因为您无法控制用户的互联网基础设施,因此您无法将其原子“锁定”到工作状态,执行工作并释放锁定。无法完成。
答案 4 :(得分:0)
查看THIS TUTORIAL,它将显示在您所连接的网络中。