android中判断是否联网的那个方法在某些情况下是不可靠的,其实最可靠的就是ping当前的网络例如ping百度看下能不能ping通,能就代表网络正常,不能就表示网络不正常,以下就是ping的代码实现:

public static boolean ping(String host, int pingCount, StringBuffer stringBuffer) {        String line = null;        Process process = null;        BufferedReader successReader = null;//        String command = "ping -c " + pingCount + " -w 5 " + host;        String command = "ping -c " + pingCount + " " + host;        boolean isSuccess = false;        try {            process = Runtime.getRuntime().exec(command);            if (process == null) {                LogUtil.e("ping fail:process is null.");                append(stringBuffer, "ping fail:process is null.");                return false;            }            successReader = new BufferedReader(new InputStreamReader(process.getInputStream()));            while ((line = successReader.readLine()) != null) {                LogUtil.i(line);                append(stringBuffer, line);            }            int status = process.waitFor();            if (status == 0) {                LogUtil.i("exec cmd success:" + command);                append(stringBuffer, "exec cmd success:" + command);                isSuccess = true;            } else {                LogUtil.e("exec cmd fail.");                append(stringBuffer, "exec cmd fail.");                isSuccess = false;            }            LogUtil.i("exec finished.");            append(stringBuffer, "exec finished.");        } catch (IOException e) {            LogUtil.e(e);        } catch (InterruptedException e) {            LogUtil.e(e);        } finally {            LogUtil.i("ping exit.");            if (process != null) {                process.destroy();            }            if (successReader != null) {                try {                    successReader.close();                } catch (IOException e) {                    LogUtil.e(e);                }            }        }        return isSuccess;    }    private static void append(StringBuffer stringBuffer, String text) {        if (stringBuffer != null) {            stringBuffer.append(text + "\n");        }    }

ping返回true表示ping通,false表示没有ping通,所谓没有ping通是指数据包没有返回,也就是客户端没有及时收到ping的返回包因此返回false,但是要是网络不可用则ping的时候也会返回true,因为ping指定有成功结束,只是ping的返回包是失败的数据包而不是成功的数据包,所以准确的说返回true表示ping指定返回完成,false表示没收到ping的返回数据,以上方法是阻塞的,android系统默认等待ping的超时是10s,可以自定义超时时间,也不用担心方法一直被阻塞,经过实测,如果ping超时就会自动返回,因为不必担心方法被阻塞导致无法运行下面的代码,这个方法最终都会结束,网上的一些ping的实现说方法会被一直阻塞,实际上是他们ping的命令没写好,以及使用io被阻塞了

更多相关文章

  1. Android:view常用属性和操作方法
  2. 在android studio中用SQLiteOpenHelper()方法建立数据库
  3. Android中显示Dialog的方法
  4. 麦子学院android老师分享android实现listview异步加载图片的方法
  5. Android Volley.jar包下载(第三方开源网络通信框架)

随机推荐

  1. 一些学习技术的视频
  2. Android汉字按拼音首字母查询
  3. Android(安卓)如何创建组合控件
  4. Android网络编程 HttpUrlConnection Http
  5. Android面试之---谈谈你对Android(安卓)N
  6. 【android】喜马拉雅FM sdk使用
  7. Android(安卓)Lint使用分析
  8. [置顶] Android学习之扩展android的权限
  9. Ubuntu下搭建Android开发环境
  10. 提高数倍工作效率的Android(安卓)Studio