/**
* 判断当前网络是否可用(6.0以上版本)
* 实时,快速
* @return
*/
public static boolean isNetSystemUsable() {
boolean isNetUsable = false;
ConnectivityManager manager = (ConnectivityManager)
Utils.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
try {
NetworkCapabilities networkCapabilities =
manager.getNetworkCapabilities(manager.getActiveNetwork());
isNetUsable = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
if (!isNetUsable) {
for (int i = 0; i < 3; i++) {
//WiFi初始连接到的瞬间,WiFi是不可用的,给过一段时间后才可用,故做循环延时判断
Thread.sleep(1000);
NetworkCapabilities networkCapability =
manager.getNetworkCapabilities(manager.getActiveNetwork());
isNetUsable = networkCapability.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
if (isNetUsable)
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return isNetUsable;
}
/**
* 此方法ping操作为非常耗时操作,必须在异步线程操作,否则容易出现ANR
* android 6.0以下使用
* @return
*/
public static boolean isNetUseful() {
int i;
Runtime runtime = Runtime.getRuntime();
Process exec = null;
try {
exec = runtime.exec("ping -c 1 -w 1 www.baidu.com");
i = exec.waitFor();//无效网络的时候这里执行非常慢
return i == 0;
} catch(Exception e) {
return false;
}finally {
//在结束的时候应该对资源进行回收
if (exec != null) {
exec.destroy();
}
runtime.gc();
}
}
public class NetPingHelper {
private boolean netUseful = false;
public void checkNetUseful(OnNetUsefulListener onNetUsefulListener) {
onNetUsefulListener.onNetUseful();//因为检验网络有效性太耗时,若已经连接了网络,则先默认网络有效
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
new Thread() {
@Override
public void run() {
super.run();
if (!isNetSystemUsable())
onNetUsefulListener.onNetUnuseful();
}
}.start();
} else {//6.0以下版本,ping
new Thread() {
@Override
public void run() {
super.run();
if (isNetUseful()) {
NetPingHelper.this.netUseful = true;
}
}
}.start();
new AppExecutors().schedule().schedule((Runnable) () -> {
if (!NetPingHelper.this.netUseful) {
onNetUsefulListener.onNetUnuseful();
}
}, 6, TimeUnit.SECONDS);//ping6秒不通执行里面的代码
}
}
public void checkNetUsefulWithoutDefault(OnNetUsefulListener onNetUsefulListener) {
//若不需要默认在线状态,用这个方法
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
new Thread() {
@Override
public void run() {
super.run();
if (NetworkUtils.isNetSystemUsable())
onNetUsefulListener.onNetUseful();
else
onNetUsefulListener.onNetUnuseful();
}
}.start();
} else {//6.0以下版本,ping
new Thread() {
@Override
public void run() {
super.run();
if (NetworkUtils.isNetUseful()) {
NetPingHelper.this.netUseful = true;
}
}
}.start();
new AppExecutors().schedule().schedule((Runnable) () -> {
if (!NetPingHelper.this.netUseful) {
onNetUsefulListener.onNetUnuseful();
} else {
onNetUsefulListener.onNetUseful();
}
}, 6, TimeUnit.SECONDS); //延时6秒,6秒还没ping通则执行里面的代码
}
}
public interface OnNetUsefulListener {
void onNetUseful();
void onNetUnuseful();
}
}
//网络ping 的定时任务
public class NetPingTimerTask {
private Timer timer = new Timer();
private void timerCancel() {
timer.cancel();
}
public void timerStart() {
try {
timer.schedule(timerTask, 2000, 6000);
} catch (Exception e) {
e.printStackTrace();
}
}
private TimerTask timerTask = new TimerTask() {
@Override
public void run() {
new NetPingHelper().checkNetUsefulWithoutDefault(new NetPingHelper.OnNetUsefulListener() {
@Override
public void onNetUseful() {
timerCancel();
}
@Override
public void onNetUnuseful() {
}
});
}
};
}