ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android执行ping命令检查网络

2019-08-29 12:07:19  阅读:430  来源: 互联网

标签:String ping 网络 private pingHandler msg Android null


因为ping要用到网络请求,所以要在AndroidManifest.xml加入网络权限:

    <uses-permission android:name="android.permission.INTERNET"/>

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<MainActivity> 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;
            }
        }
    }

具体demo已上传到GitHub

标签:String,ping,网络,private,pingHandler,msg,Android,null
来源: https://blog.csdn.net/weixin_40763897/article/details/100134430

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有