android中判断是否联网的那个方法在某些情况下是不可靠的,其实最可靠的就是ping当前的网络例如ping百度看下能不能ping通,能就代表网络正常,不能就表示网络不正常,以下就是ping的代码实现:
public static boolean ping(String host, int pingCount, StringBuffer stringBuffer) {
String line = null;
Process process = null;
BufferedReader successReader = null;
// String command = "ping -c " + pingCount + " -w 5 " + host;
String command = "ping -c " + pingCount + " " + host;
boolean isSuccess = false;
try {
process = Runtime.getRuntime().exec(command);
if (process == null) {
LogUtil.e("ping fail:process is null.");
append(stringBuffer, "ping fail:process is null.");
return false;
}
successReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = successReader.readLine()) != null) {
LogUtil.i(line);
append(stringBuffer, line);
}
int status = process.waitFor();
if (status == 0) {
LogUtil.i("exec cmd success:" + command);
append(stringBuffer, "exec cmd success:" + command);
isSuccess = true;
} else {
LogUtil.e("exec cmd fail.");
append(stringBuffer, "exec cmd fail.");
isSuccess = false;
}
LogUtil.i("exec finished.");
append(stringBuffer, "exec finished.");
} catch (IOException e) {
LogUtil.e(e);
} catch (InterruptedException e) {
LogUtil.e(e);
} finally {
LogUtil.i("ping exit.");
if (process != null) {
process.destroy();
}
if (successReader != null) {
try {
successReader.close();
} catch (IOException e) {
LogUtil.e(e);
}
}
}
return isSuccess;
}
private static void append(StringBuffer stringBuffer, String text) {
if (stringBuffer != null) {
stringBuffer.append(text + "\n");
}
}
ping返回true表示ping通,false表示没有ping通,所谓没有ping通是指数据包没有返回,也就是客户端没有及时收到ping的返回包因此返回false,但是要是网络不可用则ping的时候也会返回true,因为ping指定有成功结束,只是ping的返回包是失败的数据包而不是成功的数据包,所以准确的说返回true表示ping指定返回完成,false表示没收到ping的返回数据,以上方法是阻塞的,android系统默认等待ping的超时是10s,可以自定义超时时间,也不用担心方法一直被阻塞,经过实测,如果ping超时就会自动返回,因为不必担心方法被阻塞导致无法运行下面的代码,这个方法最终都会结束,网上的一些ping的实现说方法会被一直阻塞,实际上是他们ping的命令没写好,以及使用io被阻塞了