因为ping要用到网络请求,所以要在AndroidManifest.xml加入网络权限:
1、准备好ping命令
将IP或域名和一些参数组合成一条ping命令:
private String spellPing(String ip) {
String countCmd = " -c 4 ";
String sizeCmd = " -s 64 ";
String timeCmd = " -i 1 ";
return "ping" + countCmd + timeCmd + sizeCmd + ip;
}
2、执行ping命令
执行ping命令就是通过使用Runtime.getRuntime().exec(ping)。
Runtime.getRuntime().exec()可以执行各种各样的命令。
private void executePingCmd(String pingCmd){
executorService = Executors.newSingleThreadExecutor();
executorService.execute(new Thread(new PingTask(pingCmd, pingHandler, 1)));
}
// 创建ping任务
private class PingTask implements Runnable {
private String ping;
private PingHandler pingHandler;
private long delay;
public PingTask(String ping, PingHandler pingHandler, long delay) {
this.ping = ping;
this.pingHandler = pingHandler;
this.delay = delay;
}
@Override
public void run() {
Process process = null;
BufferedReader successReader = null;
BufferedReader errorReader = null;
try {
// 执行ping命令
process = Runtime.getRuntime().exec(ping);
// success
successReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
// error
errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String lineStr;
while ((lineStr = successReader.readLine()) != null) {
// receive
Message msg = pingHandler.obtainMessage();
msg.obj = lineStr + "\r\n";
msg.what = 10;
msg.sendToTarget();
}
while ((lineStr = errorReader.readLine()) != null) {
// receive
Message msg = pingHandler.obtainMessage();
msg.obj = lineStr + "\r\n";
msg.what = 10;
msg.sendToTarget();
}
Thread.sleep(delay * 1000);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (successReader != null) {
successReader.close();
}
if (errorReader != null) {
errorReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (process != null) {
process.destroy();
}
}
}
}
3、显示执行结果
通过Handler来通知主线程通知更新UI。
private static class PingHandler extends Handler {
private WeakReference weakReference;
public PingHandler(MainActivity activity) {
this.weakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what) {
case 10:
// 3、将结果显示出来
String resultMsg = (String) msg.obj;
weakReference.get().pingAdapter.addString(resultMsg);
weakReference.get().mRecylerView.scrollToPosition(weakReference.get().pingAdapter.getItemCount() - 1);
break;
default:
break;
}
}
}
标签:String,ping,网络,private,pingHandler,msg,Android,null
来源: https://blog.csdn.net/weixin_40763897/article/details/100134430