Android Studio中如何实时逐行输出PING命令的运行结果?
实现PING命令实时逐行输出到TextView
要实现像终端那样实时输出ping的延迟统计,核心是实时读取命令的输出流,不能等命令执行完再一次性拿结果,还要避开主线程阻塞,下面是具体实现:
- 开后台线程执行ping并读取输出:
new Thread(() -> { try { // 执行ping命令,-c指定发送包的数量,-i指定间隔时间(秒) Process process = Runtime.getRuntime().exec("ping -c 5 -i 1 www.google.com"); // 获取命令的标准输出流 BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream())); String line; // 逐行读取输出内容 while ((line = reader.readLine()) != null) { final String outputLine = line; // 切回UI线程更新TextView runOnUiThread(() -> { textView.append(outputLine + "\n"); }); } // 可选:读取错误输出,处理命令执行失败的情况 BufferedReader errorReader = new BufferedReader( new InputStreamReader(process.getErrorStream())); while ((line = errorReader.readLine()) != null) { final String errorLine = line; runOnUiThread(() -> { textView.append("错误: " + errorLine + "\n"); }); } reader.close(); errorReader.close(); process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); runOnUiThread(() -> { textView.append("命令执行出错: " + e.getMessage() + "\n"); }); } }).start();
- 几个要注意的点:
- 绝对不能在主线程里做流读取这类IO操作,必须单独开线程,否则会触发ANR
- 更新TextView必须在UI线程,这里用
runOnUiThread就行,也可以用Handler或者LiveData替代 - 不同Android设备的ping参数可能有小差异,Linux系的ping一般用
-c指定次数,可根据设备调整 - 别忘了在AndroidManifest.xml里加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
内容的提问来源于stack exchange,提问作者edwinloise
相关产品推荐
相关产品推荐

