在 Android 中检查互联网连接(功能比较)
Checking internet connection in Android (function comparison)
所以我正在比较下面我应该实现的两个功能中的哪一个。我知道有人检查 phone 是否已连接到互联网,还是检查您是否有一般连接?一个比另一个更好,一个比另一个做什么?他们做同样的事情吗?
函数 1:
public static boolean hasActiveInternetConnection(Context context) {
if (isNetworkAvailable(context)) {
try {
HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
urlc.setRequestProperty("User-Agent", "Test");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1500);
urlc.connect();
return (urlc.getResponseCode() == 200);
} catch (IOException e) {
Log.e(LOG_TAG, "Error checking internet connection", e);
}
} else {
Log.d(LOG_TAG, "No network available!");
}
return false;
}
函数 2:
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;
}
函数 2 具有更清晰的声明方式,您要求网络可用性而不是执行步骤来检查它(如函数 1 中)。
此外,Android 5.0 提供了新的多网络 API,可让您的应用动态扫描具有特定功能的可用网络,并与它们建立连接,请参阅 Wireless and Connectivity
我通常两者都用...就像你的情况一样 (isNetworkavailable && hasActiveInternetConnection)
第一种方法将检查是否存在连接(例如,如果 phone 处于飞行模式,将会有 none),如果这似乎有效,第二种方法检查是否实际上可以通过该连接接收到数据
我知道 facebook 推出了一个库来检查网络流量质量,你可以检查 github :
我认为首先使用function2。如果成功调用 function1.;-)
Function2 将确保设备上存在某种连接。如果是,则 function2 将 ping 一些 uri,在此示例中为 google。它在设备可能连接到某些 wifi 但仍然无法连接等情况下很有用
有时可能出现的唯一问题是连接速度非常慢。即使连接可用,也可能会说没有连接可用
首先,函数1.需要权限
<uses-permission android:name="android.permission.INTERNET"/>
函数2.需要
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
函数 1.
- 传输实际数据(错误)
- 如果 DNS 服务器已死则无法工作
- 如果 Google 关闭则不起作用(可能性很小,但不是 0%)
- 在慢速移动网络上,可能需要很长时间才能收到响应(非常糟糕)
实际上,您应该只使用函数 2. 并正确处理对 YOUR server
的失败请求
所以我正在比较下面我应该实现的两个功能中的哪一个。我知道有人检查 phone 是否已连接到互联网,还是检查您是否有一般连接?一个比另一个更好,一个比另一个做什么?他们做同样的事情吗?
函数 1:
public static boolean hasActiveInternetConnection(Context context) {
if (isNetworkAvailable(context)) {
try {
HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
urlc.setRequestProperty("User-Agent", "Test");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1500);
urlc.connect();
return (urlc.getResponseCode() == 200);
} catch (IOException e) {
Log.e(LOG_TAG, "Error checking internet connection", e);
}
} else {
Log.d(LOG_TAG, "No network available!");
}
return false;
}
函数 2:
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;
}
函数 2 具有更清晰的声明方式,您要求网络可用性而不是执行步骤来检查它(如函数 1 中)。 此外,Android 5.0 提供了新的多网络 API,可让您的应用动态扫描具有特定功能的可用网络,并与它们建立连接,请参阅 Wireless and Connectivity
我通常两者都用...就像你的情况一样 (isNetworkavailable && hasActiveInternetConnection)
第一种方法将检查是否存在连接(例如,如果 phone 处于飞行模式,将会有 none),如果这似乎有效,第二种方法检查是否实际上可以通过该连接接收到数据
我知道 facebook 推出了一个库来检查网络流量质量,你可以检查 github :
我认为首先使用function2。如果成功调用 function1.;-)
Function2 将确保设备上存在某种连接。如果是,则 function2 将 ping 一些 uri,在此示例中为 google。它在设备可能连接到某些 wifi 但仍然无法连接等情况下很有用
有时可能出现的唯一问题是连接速度非常慢。即使连接可用,也可能会说没有连接可用
首先,函数1.需要权限
<uses-permission android:name="android.permission.INTERNET"/>
函数2.需要
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
函数 1.
- 传输实际数据(错误)
- 如果 DNS 服务器已死则无法工作
- 如果 Google 关闭则不起作用(可能性很小,但不是 0%)
- 在慢速移动网络上,可能需要很长时间才能收到响应(非常糟糕)
实际上,您应该只使用函数 2. 并正确处理对 YOUR server
的失败请求