2
public boolean isNetworkConnected() {
    ConnectivityManager cm =
        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    }
    return false;
}

每当我的 Internet 连接或断开连接时,此功能都可以正常工作。但是有一种情况是我的互联网连接但由于互联网中的一些问题我们无法交换数据包或者你可以说无法浏览。即使在那种状态下,我也可以true从这个函数中获得,而我只想true在我的互联网运行良好时返回。

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

4

5 回答 5

1

无法以编程方式获取您正在寻找的信息。

如果存在“互联网连接问题”,例如在刚刚进入死区的蜂窝数据连接中很常见,您将看到蜂窝链接保持建立几秒钟,直到超时。在这个等待期间,当链路层仍然认为它已连接但没有数据包可以通过时,您唯一能做的就是开始等待自己——并选择一个小于或等于链路层超时值的任意超时值。

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

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

互联网连接是一种“瞬态”现象:不可能提前确定它是否可用。前一秒还在,下一秒就消失了。就像磁盘上存在文件一样。与其尝试根据 Internet 连接来更改程序逻辑的流程,不如只对明显不可用的情况做出反应,例如数据包没有通过,或者您没有得到响应,或者网络接口声明它已关闭(本质上是您调用的 Android API 正在执行的操作)。处理异常;不要试图确定它是否启动然后做某事。

总之,函数的概念本身isNetworkConnected()几乎没有意义,除了简单测试链接层是否认为它是连接的(这么多,至少可以节省您的时间和精力,因为没有链接层显然意味着已知连接不可用,而在实验检测到问题之前,所有其他故障状态都涉及未知数。)问题是,即使是在实现中对网络可用性进行最可靠和最严格的测试,isNetworkConnected()也不能原子地保证,在时间之间这isNetworkConnected()函数返回并且您开始尝试上传/下载真实数据的时间,结果没有改变。这基本上是一个无法解决的竞争条件,因为您无法控制用户的互联网基础设施,因此您无法自动将其“锁定”到工作状态、执行您的工作并释放锁定。做不到。

于 2012-09-25T17:56:29.950 回答
1

例如,您可以尝试通过 HTTP Get 访问 google.com 或其他正常运行时间较长的网站。

于 2012-09-25T17:47:36.103 回答
1

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

于 2012-09-25T17:48:03.277 回答
1

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

我建议你看看这个线程,它解释了如何进行 http 请求并找出互联网可用性。

于 2012-09-25T17:52:49.517 回答
0

查看本教程,它将显示您连接到的网络。

于 2012-09-25T17:53:45.153 回答