Android利用ping实现弱网检测

转载请注明原创出处,谢谢!

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);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容