Android 判断网络连接(二)

本文针对Android系统中判断网络连接存在的问题进行探讨,尤其是在未验证的WIFI环境下仍显示网络连接的情况。作者提供了一种通过Ping命令来精确判断网络是否可用的方法,以解决这个问题。代码中设置了超时机制,确保在网络状态变化时能快速响应,避免长时间阻塞。
摘要由CSDN通过智能技术生成

今天写了个Demo,测试Android 判断网络连接(一) 所记录的内容,发现还是有点问题:就是连接像CMCC-EDU之类的需要验证的WIFI下,在未通过验证时,居然仍然表示网络连接.
于是,又要找方法解决这个问题,结果找到了一个解决方法时,直接通过Ping来判断网络.直接看代码吧.

Runnable isReachable = new Runnable() {
    String result = null;
    ConnectivityManager netManager;
    NetworkInfo networkInfo;
    int status;
    long now, timeoutInMillis, finish;
    Process p ;

        @Override
    public void run() {
        while (!systemExitFlag) {
            try {
                Thread.sleep(5000);
                mHandler.sendEmptyMessage(MSG_NET);
                netManager = (ConnectivityManager) mContext
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
                networkInfo = netManager.getActiveNetworkInfo();
                if (networkInfo != null) {
                    // ping 的地址,可以换成任何一种可靠的外网
                    String ip = "www.baidu.com";
                    // ping网址1次 超时为3秒
                    p = Runtime.getRuntime().exec(
                                "ping -c 1 -w 3 " + ip);
                    //由于p.waitfor()会阻塞,所以设置了一个超时时间
                    now = System.currentTimeMillis();
                    timeoutInMillis = 1000 * 10;
                    finish = now + timeoutInMillis;
                    while (isAlive(p)
                        && System.currentTimeMillis() > finish) {

                        throw new InterruptedException(
                                    "Process timeout out after " + 10+ " seconds");
                        }
                        // ping的状态
                        status = p.waitFor();

                        if (status == 0) {
                            result = "success";
                            isNetConnected = true;

                        } else {
                            result = "failed";
                            isNetConnected = false;
                        }

                    } else {
                        result = "failed";
                        isNetConnected = false;
                    }
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    p.destroy();
                    result = "failed";
                    isNetConnected = false;
                    e.printStackTrace();
                } finally {
                    Log.i(TAG, "网络" + result);
                }
            }

        }
    };

    public static boolean isAlive(Process p) {
        try {
            p.exitValue();
            return false;
        } catch (IllegalThreadStateException e) {
            return true;
        }
    }

通过这样一种方法,便可以准确地判断网络连接了。
其中,
now = System.currentTimeMillis();
timeoutInMillis = 1000 * 10;
finish = now + timeoutInMillis;
while (isAlive(p)
&& System.currentTimeMillis() > finish) {
throw new InterruptedException(
"Process timeout out after " + 10+ " seconds");
}

这一段代码,是因为,在测试时,当网络连接着,突然断开时,p.waitfor()大概会阻塞1分钟,这样会导致网络判断不及时,所以设置了一个超时时间,当超过10秒则抛出异常,在异常中,把网络连接状态,设置为false。(因为,在测试中发现当网络断开着,突然连接时,p.waitfor()可以及时判断网络)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值