Android检测网络接口访问速度,ping接口获取访问时间平均值

参考博客:

ping网络接口:https://blog.csdn.net/li13650639161/article/details/78465850

精确计算BigDecimal:https://www.cnblogs.com/LeoBoy/p/6056394.html

几乎参照大神代码,只是修改了下访问时间取值,我这里取的是平均值,效果展示:

1.AndroidManifes.xml文件中添加网络访问权限

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

2.检测网络实体类

/**
 * @author jennifer
 * @date 2019/3/20
 */
public class PingNetEntity {
    /*
     TODO:进行ping操作的ip
     */
    private String ip;

    /*
     TODO:进行ping操作的次数
     */
    private int pingCount;

    /*
     TODO:ping操作超时时间
     */

    private int pingWtime;

    /*
     TODO:存储ping操作后得到的数据
     */
    private StringBuffer resultBuffer;

    /*
     TODO:ping ip花费的时间
     */
    private String pingTime;

    /*
     TODO:进行ping操作后的结果
     */
    private boolean result;

    public PingNetEntity(String ip, int pingCount, int pingWtime,StringBuffer resultBuffer) {
        this.ip = ip;
        this.pingWtime=pingWtime;
        this.pingCount = pingCount;
        this.resultBuffer = resultBuffer;
    }

    public String getPingTime() {
        return pingTime;
    }

    public void setPingTime(String pingTime) {
        this.pingTime = pingTime;
    }

    public StringBuffer getResultBuffer() {
        return resultBuffer;
    }

    public void setResultBuffer(StringBuffer resultBuffer) {
        this.resultBuffer = resultBuffer;
    }

    public int getPingCount() {
        return pingCount;
    }

    public void setPingCount(int pingCount) {
        this.pingCount = pingCount;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public boolean isResult() {
        return result;
    }

    public void setResult(boolean result) {
        this.result = result;
    }

    public int getPingWtime() {
        return pingWtime;
    }

    public void setPingWtime(int pingWtime) {
        this.pingWtime = pingWtime;
    }
}

 3.ping网络工具类

/**
 * @author jennifer
 * @date 2019/3/20
 * @desc:ping工具类
 */
public class PingNet {
    private static final String TAG = "PingNet";

    /**
     * @param pingNetEntity 检测网络实体类
     * @return 检测后的数据
     */
    public static PingNetEntity ping(PingNetEntity pingNetEntity) {
        String line;
        Process process = null;
        BufferedReader successReader = null;
        //ping -c 次数 -w 超时时间(s) ip
        String command = "ping -c " + pingNetEntity.getPingCount() + " -w " + pingNetEntity.getPingWtime() + " " + pingNetEntity.getIp();
        try {
            process = Runtime.getRuntime().exec(command);
            if (process == null) {
                Log.e(TAG, "ping fail:process is null.");
                append(pingNetEntity.getResultBuffer(), "ping fail:process is null.");
                pingNetEntity.setPingTime(null);
                pingNetEntity.setResult(false);
                return pingNetEntity;
            }
            successReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            int count = 0;
            BigDecimal sum = new BigDecimal(0);
            while ((line = successReader.readLine()) != null) {
                Log.e(TAG, line);
                append(pingNetEntity.getResultBuffer(), line);
                BigDecimal time = getTime(line);
                if (time != null) {
                    sum = sum.add(time);
                    count++;
                }
            }
            //时间取平均值,四舍五入保留两位小数
            if (count > 0)
                pingNetEntity.setPingTime((sum.divide(new BigDecimal(count), 2, BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toPlainString() + " ms"));
            else
                pingNetEntity.setPingTime(null);
            int status = process.waitFor();
            if (status == 0) {
                Log.e(TAG, "exec cmd success:" + command);
                append(pingNetEntity.getResultBuffer(), "exec cmd success:" + command);
                pingNetEntity.setResult(true);
            } else {
                append(pingNetEntity.getResultBuffer(), "exec cmd fail.");
                pingNetEntity.setPingTime(null);
                pingNetEntity.setResult(false);
            }
            Log.e(TAG, "exec finished.");
            append(pingNetEntity.getResultBuffer(), "exec finished.");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            Log.e(TAG, "ping exit.");
            if (process != null) {
                process.destroy();
            }
            if (successReader != null) {
                try {
                    successReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        Log.e(TAG, pingNetEntity.getResultBuffer().toString());
        return pingNetEntity;
    }

    private static void append(StringBuffer stringBuffer, String text) {
        if (stringBuffer != null) {
            stringBuffer.append(text + "\n");
        }
    }

    /**
     * 获取ping接口耗时
     *
     * @param line
     * @return BigDecimal避免float、double精准度问题
     */
    private static BigDecimal getTime(String line) {
        String[] lines = line.split("\n");
        String time = null;
        for (String l : lines) {
            if (!l.contains("time="))
                continue;
            int index = l.indexOf("time=");
            time = l.substring(index + "time=".length());
            index = time.indexOf("ms");
            time = time.substring(0, index);
            Log.e(TAG, time);
        }
        return time == null ? null : new BigDecimal(time.trim());
    }
}

4.xml页面布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="vertical"
    tools:context=".ui.environment.EnvironmentTestActivity">

    <TextView
        android:id="@+id/tv_net"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:layout_marginLeft="@dimen/size_15"
        android:layout_marginRight="@dimen/size_15"
        android:layout_marginTop="@dimen/size_42"
        android:background="@drawable/shape_radiu10_base"
        android:gravity="center"
        android:text="@string/environment_net"
        android:textColor="@color/base_color"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="@dimen/size_15"
        android:background="@drawable/shape_radiu10_base"
        android:padding="@dimen/size_5"
        android:textSize="16sp" />
</LinearLayout>

5.Activity中的使用,网络检测本身是耗时操作所以要在子线程中进行,获取到结果后在Handler中处理

public class EnvironmentTestActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView tvNet, tvContent;
    private static final String BAIDU_API = "www.baidu.com";
    private static final String CSDN_API = "www.csdn.net";
    private static final String JIANSHU_API = "www.jianshu.com";

    private static final int UPDATE_CONTENT = 1111;
    private List<String> lstApi;
    private static final String TAG = "EnvironmentTestActivity";
    private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_environment_test);
        initData();
        initView();
        initListener();
    }

    @SuppressLint("HandlerLeak")
    private void initData() {
        lstApi = new ArrayList<>();
        lstApi.add(BAIDU_API);
        lstApi.add(CSDN_API);
        lstApi.add(JIANSHU_API);
        handler = new Handler() {
            @SuppressLint("SetTextI18n")
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                    case UPDATE_CONTENT:
                        tvContent.setText(tvContent.getText().toString() + msg.obj.toString());
                        break;
                }
            }
        };
    }

    private void initView() {
        tvNet = findViewById(R.id.tv_net);
        tvContent = findViewById(R.id.tv_content);
    }

    private void initListener() {
        tvNet.setOnClickListener(this);
        tvContent.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tv_net:
                for (final String api : lstApi) {
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            PingNetEntity pingNetEntity = new PingNetEntity(api, 3, 5, new StringBuffer());
                            pingNetEntity = PingNet.ping(pingNetEntity);
                            Log.e("testPing",pingNetEntity.getIp());
                            Log.e("testPing","time="+pingNetEntity.getPingTime());
                            Log.e("testPing",pingNetEntity.isResult()+"");
                            Message msg = new Message();
                            msg.obj = pingNetEntity.getIp() + " 耗时:" + pingNetEntity.getPingTime() + "\n";
                            msg.what = UPDATE_CONTENT;
                            handler.sendMessage(msg);
                        }
                    }).start();
                }
                break;
        }
    }
}
扫描二维码关注公众号,回复: 17216620 查看本文章

猜你喜欢

转载自blog.csdn.net/jie_0754/article/details/88718976