转载请注明原创出处,谢谢!
- GitHub: @Ricco
ps:产品提了个需求,要求每秒显示网络延迟,网络差的时候,做一些提示,例如你打游戏的时候,右上角显示的延时。
优点:
使用了线程池的概念,不会有每秒都创建一个线程,比较耗费资源的情况。
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import androidx.annotation.NonNull;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class PingUtil {
private PingCallBack callBack;
private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);
private volatile int ping = Integer.MIN_VALUE;
private Handler pingHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
if (msg.what == 0) {
if (callBack != null && Integer.MIN_VALUE != ping) {
// 回调主线程
callBack.onPing(ping);
}
executorService.execute(() -> {
// 子线程获取网络延时
Future<Integer> future = null;
try {
future = executorService.submit(() -> getNetworkLatency());
ping = Math.max(0, Math.min(future.get(1000, TimeUnit.MILLISECONDS), 999));
} catch (Exception e) {
ping = 999;
} finally {
if (future != null) {
future.cancel(true);
}
}
});
pingHandler.sendEmptyMessageDelayed(0, 1000);
}
}
};
public PingUtil(PingCallBack callBack) {
this.callBack = callBack;
}
/**
* 获取网络延时
*/
private int getNetworkLatency() {
Process process = null;
BufferedReader reader = null;
try {
// 在命令行中执行 ping 命令
process = Runtime.getRuntime().exec("ping -c 1 -w 999 baidu.com");
reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
// 读取 ping 命令的输出
StringBuilder output = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
output.append(line).append("\n");
}
// 解析 ping 命令输出,获取延迟信息
int index = output.indexOf("time=");
if (index != -1) {
int startIndex = index + 5;
int endIndex = output.indexOf(" ms", startIndex);
String latencyString = output.substring(startIndex, endIndex);
return (int) Double.parseDouble(latencyString);
} else {
return -1; // 未能获取到延迟信息
}
} catch (Exception e) {
return -2; // 出现异常
} finally {
try {
if (reader != null) {
reader.close();
}
if (process != null) {
process.destroy();
}
} catch (Exception e) {
// Log closing exception
}
}
}
// start
public void start() {
stop();
pingHandler.sendEmptyMessage(0);
}
// stop
public void stop() {
ping = Integer.MIN_VALUE;
pingHandler.removeCallbacksAndMessages(null);
}
public interface PingCallBack {
void onPing(int ping);
}
}