android 网络连接 网络是否可用,Android 使用ping判断网络/WIFI连接是否可用

最近项目中有一个网络判断的需求,因为终端只能连接wifi,wifi即使连接上也可能会出现不能连接网络的问题,所以需要进行网络连接的判断。

ping的相关知识

使用ping检验网络是否可以连接

ping就是检测客户端是否可以上网。

那么我们就上代码

该段代码来自http://blankj.com

导入常用工具包compile 'com.blankj:utilcode:1.9.8'

这个里边有各种各样的常用的工具类,下边的代码是NetworkUtils的一个方法;

/**

* 判断网络是否可用

*

需添加权限 {@code }

*

需要异步ping,如果ping不通就说明网络不可用

*

* @param ip ip地址(自己服务器ip),如果为空,ip为阿里巴巴公共ip

* @return {@code true}: 可用
{@code false}: 不可用

*/

public static boolean isAvailableByPing(String ip) {

if (ip == null || ip.length() <= 0) {

ip = "223.5.5.5";// 阿里巴巴公共ip

}

ShellUtils.CommandResult result = ShellUtils.execCmd(String.format("ping -c 1 %s", ip), false);

boolean ret = result.result == 0;

if (result.errorMsg != null) {

Log.d("NetworkUtils", "isAvailableByPing() called" + result.errorMsg);

}

if (result.successMsg != null) {

Log.d("NetworkUtils", "isAvailableByPing() called" + result.successMsg);

}

return ret;

}

这段代码完全可以作为网络检测的使用,可是我在使用这段代码的时候偶尔会遇到anr的问题。出现anr就说明在主线程做了耗时操作,这是我没有将这段代码放到子线程造成的问题。其实ping也就相当于去请求网络,跟普通的接口请求差不多,当网络比较慢的时候就会消耗时间,放在主线程就会造成anr。

在修改bug的时候我对这段代码进行了一些修改:

* 判断网络是否可用

*

需添加权限 {@code }

*

需要异步ping,如果ping不通就说明网络不可用

*

* @param ip ip地址(自己服务器ip),如果为空,ip为阿里巴巴公共ip

* @return {@code true}: 可用
{@code false}: 不可用

*/

public static boolean isAvailableByPing(String ip) {

if (ip == null || ip.length() <= 0) {

ip = "223.5.5.5";// 阿里巴巴公共ip

}

Runtime runtime = Runtime.getRuntime();

Process ipProcess = null;

try {

//-c 后边跟随的是重复的次数,-w后边跟随的是超时的时间,单位是秒,不是毫秒,要不然也不会anr了

ipProcess = runtime.exec("ping -c 3 -w 3 "+ip);

int exitValue = ipProcess.waitFor();

Log.i("Avalible", "Process:" + exitValue);

return (exitValue == 0);

} catch (IOException | InterruptedException e) {

e.printStackTrace();

} finally {

//在结束的时候应该对资源进行回收

if (ipProcess != null) {

ipProcess.destroy();

}

runtime.gc();

}

return false;

}

只需要把这个方法引用到子线程中就行了,其实不引用也可以,因为在这里设定了超时时间为3秒。但是最好是放到子线程里边。

问题补充

上边的代码在Android 7.1.2中出现了问题,好好的WIFI连接上之后,ping不通,每次waitfor都返回1,返回一表示WiFi连接,但是没有网络。其实是有网络的,很奇怪。

解决方法:

这里我获取了ping时抓包的信息,判断是否丢包为100%。如果为100%,就说明网络有问题。不是100%说明网络连接没问题。

废话不多说,直接上代码!老铁双击666,,哈哈😄

public boolean isNetworkOnline() {

Runtime runtime = Runtime.getRuntime();

Process ipProcess = null;

try {

ipProcess = runtime.exec("ping -c 5 -w 4 223.5.5.5");

InputStream input = ipProcess.getInputStream();

BufferedReader in = new BufferedReader(new InputStreamReader(input));

StringBuffer stringBuffer = new StringBuffer();

String content = "";

while ((content = in.readLine()) != null) {

stringBuffer.append(content);

}

int exitValue = ipProcess.waitFor();

if (exitValue == 0) {

//WiFi连接,网络正常

return true;

} else {

if (stringBuffer.indexOf("100% packet loss") != -1) {

//网络丢包严重,判断为网络未连接

return false;

} else {

//网络未丢包,判断为网络连接

return true;

}

}

} catch (IOException | InterruptedException e) {

e.printStackTrace();

} finally {

if (ipProcess != null) {

ipProcess.destroy();

}

runtime.gc();

}

return false;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 富文本框架_当微擎框架遇上uniapp,以一当十同时开发十个平台项目

随着各类平台异军突起&#xff0c;流量也越来越分散。为了适应时代的发展&#xff0c;不少公司在做产品项目的时候&#xff0c;需要例如网站、公众号、H5、微信小程序、抖音小程序、支付宝小程序、百度小程序、360小程序、快应用、安卓app、苹果app的需求。这么多平台&#xff…

mesh 协调器 路由器_关于Mesh网络中,协调器和路由器之间的几个问题?

1&#xff0c;由于我所搭建的整个网络是Mesh网络&#xff0c;不牵涉到低功耗的情况&#xff0c;所以网络中只有两种类型的设备&#xff1a;协调器和路由器即&#xff1a;1个协调器N个路由器2&#xff0c;为了防止协调器在掉电的情况下路由器去维持整个网络&#xff0c;这样协调…

html5写入唯一标识,id - 唯一标识符 - html5全局属性

idid全局属性定义唯一标识符(ID)&#xff0c;该标识符在整个文档中必须是唯一的。其目的是在链接(使用片段标识符)&#xff0c;脚本或样式(使用CSS)时标识元素。示例A normal, boring paragraph. Try not to fall asleep.The most exciting paragraph on the page. One of a ki…

python 文本相似度_【机器学习】使用gensim 的 doc2vec 实现文本相似度检测

环境 Python3&#xff0c; gensim&#xff0c;jieba&#xff0c;numpy &#xff0c;pandas 原理&#xff1a;文章转成向量&#xff0c;然后在计算两个向量的余弦值。 Gensim gensim是一个python的自然语言处理库&#xff0c;能够将文档根据TF-IDF, LDA, LSI 等模型转化成向量模…

list的exc_集合框架

List是有序的Collection&#xff0c;使用此接口能够精确的控制每一个元素的插入位置&#xff0c;及使用索引访问List中的元素&#xff0c;List存储元素是有序的、可重复。除了具备Collection接口必备的Iterator()方法外&#xff0c;List还提供了listIterator()方法返回一个List…

html鼠标经过的特效代码,使用mouse事件实现简单的鼠标经过特效

代码超级简单&#xff0c;这里就不多BB了&#xff0c;直接奉上Documentbody,ul,li{margin:0; padding:0; list-style:none}ul li{width:100px; height:100px; border:1px solid #f00; float:left; margin:50px 10px; background-color:#ffffff;}ul li.current{border:1px solid…

ubuntu tomcat上传目录权限_等了 3 年,Ubuntu Studio 终于有权限上传更新包

Ubuntu 的衍生版本 Ubuntu Studio 终于选出了两位具有上传更新包权限的开发者。此前就有媒体报导过&#xff0c;Ubuntu Studio 19.04 版本可能会流产&#xff0c;而原因很让人诧异&#xff1a;社区里没有任何一位开发者具有上传更新包的权限。随后 Ubuntu Studio 委员会主席 Er…

log中文乱码 springboot_springboot + shiro 权限注解、统一异常处理、请求乱码解决

springboot shiro 权限注解、统一异常处理、请求乱码解决前篇后台权限管理系统20200808新版本更新版本升级及内容优化版本&#xff0c;改动内容&#xff1a;版本更新&#xff0c;springboot从1.5升级到2.1&#xff1b;权限缓存使用redis&#xff1b;验证码使用redis&#xff1…

html表格横向竖向滚动,利用纯css实现table固定列与表头中间横向滚动的思路和实例...

前言最近在做的后台管理系统要处理大量的表格&#xff0c;因为原项目是采用的for循环加拼接字符串的方式实现;导致js代码一大堆;各种单引号和双引号的嵌套;让人头疼;遂引入vue.js;用v-for做模板渲染;工作量顿时减轻不少,心情舒畅;文字被强制换行了由于个别表的列数较多;文字都挤…

android判断主线程_android中从子线程切换到主线程,但是显得代码很臃肿,请教大牛是怎么自定义的?...

小弟新手一枚&#xff0c;我先来说说我自己在项目中的做法。因为小弟只有JAVAWEB的基础所以只能使用线程池来处理线程之间的切换1.为了使APP不出现卡顿和内存的低消耗。我是用了synchronized 和用一个Map 来限定每次只能运行一条子线程&#xff0c;Map 键&#xff1a;TAG 线程任…

python十进制转二进制循环_python十进制转二进制的详解

python十进制转二进制 python中十进制转二进制使用 bin() 函数。 bin() 返回一个整数 int 或者长整数 long int 的二进制表示。 下面是使用示例&#xff1a; >>>bin(10) 0b1010 >>> bin(20) 0b10100 补充&#xff1a;十进制转8进制和16进制的方法&#xff1a…

计算机主机硬件图片,电脑主机内部有哪些硬件

电脑主机内部有哪些硬件电脑主机里的硬件都有哪些呢&#xff0c;你知道吗?下面将由小编带大家来解答这个疑问吧&#xff0c;希望对大家有所收获!从主机外部看硬件从外边看&#xff0c;主机就是一个扁扁方方的铁盒子&#xff0c;但很多朋友确没有真正了解过它内部到底是什么样子…

springboot profile_SpringBoot简单配置

使用Spring Boot&#xff0c;配置工作将会变得更加简单&#xff0c;我们只需要在application.properties中定义属性&#xff0c;然后在代码中直接使用Value注入即可。 如下&#xff1a;book.authorxxxbook.nameyyy book.pinyin测试这里专门设置了中文&#xff0c;因为中文不做特…

cc9.3 indesign_InDesign2018mac中文版_Adobe InDesign CC 2018 for mac官方版 - 17软件下载

Adobe InDesign CC 2018 Mac简体中文版&#xff0c;版本号&#xff1a;V13.1.0.76&#xff0c;软件采用了全新的启动界面&#xff0c;更新和改进众多功能。并且支持多国语言版本&#xff1a;中文&#xff0c;英文&#xff0c;韩文&#xff0c;日本等多国语言。安装方法&#xf…

大工14秋《计算机应用基础》在线测试2,2017大工《计算机应用基础》在线测试2答案.doc...

大工17秋《计算机应用基础》在线测试2答案?1: 单选题 (4分)在Excel 2010中,存储数据的表格被称为()。A: 文件B: 文件夹C: 工作表D: 图表2: 单选题 (4分)在Excel 2010中,图表是()。A: 用户通过“绘图”工具栏的工具绘制的特殊图形B: 由数据清单生成的用于形象表现数据的图形C: …

druid jar包_使用druid实现Spring boot配置文件中数据库密码密文存储

通常在编写代码的时候&#xff0c;数据库的用户名和密码以明文的方法写到配置文件中&#xff0c;系统运维为了保证一定的安全性&#xff0c;要求我们在配置文件中使用密文的方式存储&#xff0c;本文主要介绍使用druid实现数据库密码密文显示的方法。一、基本情况druid包中Conf…

嵌入式linux python移植过程_嵌入式linux项目开发(一)——BOA移植

嵌入式linux项目开发(一)——BOA移植项目目标&#xff1a;使用BOA、CGIC、SQLite搭建嵌入式web服务器一、嵌入式web服务器BOA简介在嵌入式设备的管理与交互中&#xff0c;基于Web方式的应用成为目前的主流&#xff0c;即在嵌入式设备上运行一个支持脚本或CGI功能的Web服务器&am…

html课做一个网页,菜鸟自学建站 HTML 第三课 制作我的第一个网页_html/css_WEB-ITnose...

上一课我们了解了Dreamweaver的工作界面&#xff0c;从这节课开始&#xff0c;我们由浅入深的开始学习网页的制作。首先打开Dreamweaver&#xff0c;制作网页首先要新建一个文档&#xff0c;就像我们写文稿需要一张纸一样。只有有了载体&#xff0c;你才能在上面进行创作&#…

k8s 手动恢复redis 集群_高工面试之:redis的几种集群方式你都熟悉吗?

Redis三种集群方式&#xff1a;主从复制、哨兵模式和Cluster模式一、主从复制模式Redis配置成主从模式&#xff0c;主库(Master)只负责客户端的写数据&#xff0c;从库(Slave)只负责客户端的读数据。主从数据复制过程如图所示&#xff1a;主从复制原理&#xff1a;slave redis连…

mock模拟接口测试 vue_Easy Mock以及Vue+Mock.js模拟数据

Easy Mock以及VueMock.js模拟数据一、Mock.js简介Mock.js是一个可以模拟后端数据&#xff0c;也可以模拟增删改查操作的js库基础语法规范数据模板中的每个属性由 3 部分构成&#xff1a;属性名、生成规则、属性值&#xff1a;name|rule: value语法规则说明name|min-max: string…