ConnectivityManager
类。通过调用 getSystemService(Context.CONNECTIVITY_SERVICE)
获取 ConnectivityManager
实例,然后使用 isActiveNetworkMetered()
方法判断是否有活动网络连接。
使用ConnectionManager方式
| 方法名 | 描述 | 代码示例 |
| –| –| –|
| isNetConnection(Context mContext) | 判断当前是否有网络连接,但如果该连接的网络无法上网,也会返回true。 | “`java
public static boolean isNetConnection(Context mContext) {
if (mContext!=null){
ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
boolean connected = networkInfo.isConnected();
if (networkInfo!=null&&connected){
if (networkInfo.getState()== NetworkInfo.State.CONNECTED){
return true;
}else{
return false;
}
}
}
return false;
“` |
使用NetworkCapabilities类方式(6.0以上)
| 方法名 | 描述 | 代码示例 |
| –| –| –|
| isNetSystemUsable(Context context) | 判断当前网络是否可用,而且是不耗时的方法。 | “`java
public static boolean isNetSystemUsable(Context context) {
boolean isNetUsable = false;
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
if (networkCapabilities != null) {
isNetUsable = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
}
}
return isNetUsable;
“` |
注意:此方法需要在子线程调用,否则报错:android.os.NetworkOnMainThreadException
| 方法名 | 描述 | 代码示例 |
| –| –| –|
| isNetOnline() | 功能:检测当前URL是否可连接或是否有效,最多连接网络x次,如果x次都不成功,视为该地址不可用。 | “`java
private static URL url;
private static HttpURLConnection con;
private static int state = -1;
public static boolean isNetOnline() {
int counts = 0;
boolean isNetsOnline = true;
while (counts < 2) {
try {
url = new URL("https://www.baidu.com");
con = (HttpURLConnection) url.openConnection();
state = con.getResponseCode();
Log.e("FragmentNet", "isNetOnline counts: " + counts + "=state: " + state);
if (state == 200) {
isNetsOnline = true;
}
break;
} catch (Exception ex) {
isNetsOnline = false;
counts++;
Log.e("FragmentNet", "isNetOnline URL不可用,连接第 " + counts + " 次");
continue;
}
}
return isNetsOnline;
“` |
问题1:为什么在检测网络是否能正常上网时需要在子线程调用?
解答:在Android 4.0(API级别14)之后,不允许在主线程中进行网络操作,否则会抛出android.os.NetworkOnMainThreadException
异常,为了确保应用的稳定性和响应性,需要在子线程中执行网络请求。
问题2:如何获取当前网络连接的类型信息?
解答:可以通过ConnectivityManager
的getActiveNetworkInfo()
方法获取当前的网络连接信息,然后调用getType()
方法获取网络连接的类型。
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); if (mNetworkInfo != null && mNetworkInfo.isAvailable()) { int type = mNetworkInfo.getType(); // 获取网络类型,如ConnectivityManager.TYPE_WIFI等 }