2012-09-25 63 views
2
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如何确保互联网在Android上正常工作

在这种情况下我能做些什么?谢谢。

回答

1

您可以尝试例如HTTP获取到google.com或其他高正常运行时间的网站。

1

在这种情况下,唯一可行的方法是下载一个小的已知文件并验证其完整性。需要这种情况的一种情况是在开放式咖啡馆wifis上。任何人都可以连接到他们,但所有网络请求都会重定向到他们的“网关”,直到您接受他们的条款和条件。

1

是的,它发生在少数情况下,例如http超时例外,因为可能会出现网络连接但没有实际的互联网连接的情况,因为访问它的唯一方式是通过例如VPN--这样有,另外,例如,WI-FI连接可用,但由于ISP的某些问题没有实际的互联网流量。

我建议你看看this线程,它解释了如何做http请求并找出网络可用性。

1

没有办法以编程方式获得您正在寻找的信息。

如果存在“互联网连接问题”,比如刚刚进入死区的蜂窝数据连接非常常见,您会看到蜂窝链接保持几秒钟,直至超时。在等待期间,虽然链路层仍然认为它已经连接,但没有数据包可以通过,唯一可以做的就是开始等待自己 - 然后选择小于或等于链路层超时值的任意超时值。

由于基于超时的连接是基于等待任意一段时间,然后决定是否认为数据包将到达,所以没有通用的解决方案来确定 - 没有阻塞 - 如果连接将会成功。毕竟,仅仅因为之前发送的数据包通过了,并不意味着连接不会立即被杀死。

我不同意试图从某个URL获取小资源的测试。该测试是有问题的,因为它涉及阻塞,这会减慢你的程序。如果程序实际尝试发送的数据包在链路层或协议层超时之前能够通过,您将得到结果。如果数据包无法通过,您将无法获得结果。就这么简单。

互联网连接是一个“短暂”现象:不可能确保它提前可用。它在那里瞬间消失了。就像磁盘上存在一个文件一样。与其试图通过互联网连接来改变程序逻辑的流程,您应该只是将反应为,这种情况下连接性显然不可用,例如数据包未通过,或者您没有得到响应,或者网络接口声明它已关闭(实质上是你所调用的Android API在做什么)。处理异常;不要试图确定它是否起作用,然后做点什么。

总之,一个isNetworkConnected()功能非常概念大多是毫无意义的,除了的链路层是否认为它是连接或不简单的测试(即多了,至少,可以节省您的时间和精力,因为没有链路层明显暗示连接是已知的不可用,而所有其他故障状态在实验检测到问题后才会涉及未知状态。)问题是,即使是最可靠和最严格的网络可用性测试执行isNetworkConnected()不能原子上保证,在isNetworkConnected()函数返回的时间和你开始的时间之间试图上传/下载真实数据,结果没有改变。它基本上是一种无法解决的竞争条件,因为您不控制用户的互联网基础设施,因此您不能自动将其“锁定”到工作状态,执行您的工作并释放锁定。无法完成。

相关问题