Android检查设备是否可以访问互联网,判断Internet连接,测试网络请求,解析域名
安卓SDK提供了ConnectivityManager类,那么我们就可以轻松的获取设备的网络状态以及联网方式等信息。
但是要想知道安卓设备连接的网络能不能访问到Internet,就要费一番周折了。
本文为大家介绍三种方式来检查Internet连接状态。
1、使用Linux系统ping ip的命令方式检查设备的Internet连接状态。
2、使用HttpURLConnection的get请求方式检查设备的Internet连接状态。(可以设置超时时长)
3、使用java.net.InetAddress解析域名的方式检查设备的Internet连接状态。(可以设置超时时长)
贴出检查方法以供参考,如下:
一、ping IP方式:
public class NetWorkUtils{ /**
* 检查互联网地址是否可以访问
*
* @param address 要检查的域名或IP地址
* @param callback 检查结果回调(是否可以ping通地址){@see java.lang.Comparable<T>}
*/
public static void isNetWorkAvailable(final String address, final Comparable<Boolean> callback) {
final Handler handler = new Handler() { @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (callback != null) {
callback.compareTo(msg.arg1 == 0);
}
} };
new Thread(new Runnable() { @Override
public void run() {
Runtime runtime = Runtime.getRuntime();
Message msg = new Message();
try {
Process pingProcess = runtime.exec("/system/bin/ping -c 1 " + address);
InputStreamReader isr = new InputStreamReader(pingProcess.getInputStream());
BufferedReader buf = new BufferedReader(isr);
if (buf.readLine() == null) {
msg.arg1 = -1;
} else {
msg.arg1 = 0;
}
buf.close();
isr.close();
} catch (Exception e) {
msg.arg1 = -1;
e.printStackTrace();
} finally {
runtime.gc();
handler.sendMessage(msg);
}
} }).start();
} }
可以使用ping www.baidu.com,进行测试。当然,你也可以ping你们的服务器地址。如下:
NetWorkUtils.isNetWorkAvailable("www.baidu.com", new Comparable<Boolean>() { @Override
public int compareTo(Boolean available) {
if (available) {
// TODO 设备访问Internet正常
} else {
// TODO 设备无法访问Internet
}
return 0;
} });
二、get请求方式:
public class NetWorkUtils{ /**
* 检查互联网地址是否可以访问-使用get请求
*
* @param urlStr 要检查的url
* @param callback 检查结果回调(是否可以get请求成功){@see java.lang.Comparable<T>}
*/
public static void isNetWorkAvailableOfGet(final String urlStr, final Comparable<Boolean> callback) {
final Handler handler = new Handler() { @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (callback != null) {
callback.compareTo(msg.arg1 == 0);
}
} };
new Thread(new Runnable() { @Override
public void run() {
Message msg = new Message();
try {
Connection conn = new Connection(urlStr);
Thread thread = new Thread(conn);
thread.start();
thread.join(3 * 1000); // 设置等待DNS解析线程响应时间为3秒
int resCode = conn.get(); // 获取get请求responseCode
msg.arg1 = resCode == 200 ? 0 : -1;
} catch (Exception e) {
msg.arg1 = -1;
e.printStackTrace();
} finally {
handler.sendMessage(msg);
}
} }).start();
} /**
* HttpURLConnection请求线程
*/
private static class Connection implements Runnable {
private String urlStr;
private int responseCode; public Connection(String urlStr) {
this.urlStr = urlStr;
} public void run() {
try {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.connect();
set(conn.getResponseCode());
} catch (Exception e) {
e.printStackTrace();
}
} public synchronized void set(int responseCode) {
this.responseCode = responseCode;
} public synchronized int get() {
return responseCode;
}
} }
可以请求http://www.baidu.com,进行测试。当然,你也可以写你们的服务器地址。如下:
NetWorkUtils.isNetWorkAvailableOfGet("http://www.baidu.com", new Comparable<Boolean>() { @Override
public int compareTo(Boolean available) {
if (available) {
// TODO 设备访问Internet正常
} else {
// TODO 设备无法访问Internet
}
return 0;
} });
三、DNS解析方式:
public class NetWorkUtils{ /**
* 检查互联网地址是否可以访问-使用DNS解析
*
* @param hostname 要检查的域名或IP
* @param callback 检查结果回调(是否可以解析成功){@see java.lang.Comparable<T>}
*/
public static void isNetWorkAvailableOfDNS(final String hostname, final Comparable<Boolean> callback) {
final Handler handler = new Handler() { @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (callback != null) {
callback.compareTo(msg.arg1 == 0);
}
} };
new Thread(new Runnable() { @Override
public void run() {
Message msg = new Message();
try {
DNSParse parse = new DNSParse(hostname);
Thread thread = new Thread(parse);
thread.start();
thread.join(3 * 1000); // 设置等待DNS解析线程响应时间为3秒
InetAddress resCode = parse.get(); // 获取解析到的IP地址
msg.arg1 = resCode == null ? -1 : 0;
} catch (Exception e) {
msg.arg1 = -1;
e.printStackTrace();
} finally {
handler.sendMessage(msg);
}
} }).start();
} /**
* DNS解析线程
*/
private static class DNSParse implements Runnable {
private String hostname;
private InetAddress address; public DNSParse(String hostname) {
this.hostname = hostname;
} public void run() {
try {
set(InetAddress.getByName(hostname));
} catch (Exception e) {
e.printStackTrace();
}
} public synchronized void set(InetAddress address) {
this.address = address;
} public synchronized InetAddress get() {
return address;
}
} }
可以解析百度www.baidu.com,进行测试。当然,你也可以解析自己的域名。如下:
NetWorkUtils.isNetWorkAvailableOfDNS("www.baidu.com", new Comparable<Boolean>() { @Override
public int compareTo(Boolean available) {
if (available) {
// TODO 设备访问Internet正常
} else {
// TODO 设备无法访问Internet
}
return 0;
} });
本文只为测试网络连接状态使用,用到了三种常用的Internet状态检查方式,如果想在做某些网络操作之前检查Internet是否连通,建议使用后两种方式,可以自己定义等待响应的时间。我设置的是3秒。如果使用ping IP的方式的话,如果无法访问到Internet,则需要等待较长的时间。
以上。本人经验尚浅,不足之处还望大神给予指导。谢谢!
转:https://blog.csdn.net/sgyingyin/article/details/70174402
Android检查设备是否可以访问互联网,判断Internet连接,测试网络请求,解析域名的更多相关文章
- Android之三种网络请求解析数据(最佳案例)
AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...
- (转载)Android之三种网络请求解析数据(最佳案例)
[置顶] Android之三种网络请求解析数据(最佳案例) 2016-07-25 18:02 4725人阅读 评论(0) 收藏 举报 分类: Gson.Gson解析(1) 版权声明:本文为博主原创 ...
- Android Studio 模拟器(AVD)访问互联网
模拟器默认是不可以直接访问互联网的,需要为模拟器配置 DNS 服务器. (一)找到模拟器安装的位置 模拟器安装位置在安卓 SDK 下面,进入[SDK Path]/emulator. (二)打开终端输入 ...
- 基于Android Volley的网络请求工具
基于Android Volley的网络请求工具. 一.说明 AndroidVolley,Android Volley核心库及扩展工程.AndroidVolleySample,网络请求工具示例工程.Re ...
- Android异步加载访问网络图片-解析json
来自:http://www.imooc.com/video/7871 推荐大家去学习这个视频,讲解的很不错. 慕课网提供了一个json网址可以用来学习:http://www.imooc.com/api ...
- Android 使用 HTTP 协议访问网络
正在看<第一行代码>,记录一下使用 HTTP 协议访问网络的内容吧! 在Android发送Http请求有两种方式,HttpURLConnection和HttpClient. 1.使用Htt ...
- nginx只允许移动端访问( 判断拦截pc浏览器访问)
set $mobile_request '0'; if ($http_user_agent ~* (Android|webOS|iPhone|iPod|BlackBerry)) { set $mobi ...
- Android中的各种访问权限Permission含义
android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序 android. ...
- Android使用Http协议访问网络——HttpConnection
套路篇 使用HttpConnection访问网络一般有如下的套路: 1.获取到HttpConnection的实例,new出一个URL对象,并传入目标的网址,然后调用一下openConnection() ...
随机推荐
- Codeforces Round #215 (Div. 2) D. Sereja ans Anagrams
http://codeforces.com/contest/368/problem/D 题意:有a.b两个数组,a数组有n个数,b数组有m个数,现在给出一个p,要你找出所有的位置q,使得位置q q+ ...
- 基于jQuery自适应宽度跟高度可自定义焦点图
基于jQuery自适应宽度跟高度可自定义焦点图.这是一款带左右箭头,缩略小图切换的jQuery相册代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <section cl ...
- CACTI命令行添加DEVICE/GRAPH/TREE
有时要加入大量的机器到 Cacti ,直接修改 Cacti 还是很复杂的.所以最好还是通过他本身提供的工具来实现. Cacti 早就为我们想到过这个问题了.这些工具就在 cacti/cli 目 ...
- [开发笔记]-Linq to xml学习笔记
最近需要用到操作xml文档的方法,学习了一下linq to xml,特此记录. 测试代码: class Program { //参考: LINQ to XML 编程基础 - luckdv - 博客园 ...
- c# 自定义类型的DataBindings
自定义类型TextBoxEx,扩展了TextBox,增加了一个属性KeyText来保存后台的值(Tag已另作它用). 程序里面需要将KeyText和DataTable的某个列绑定起来. 如果是Text ...
- mysql查找有某列但没有此列索引的表
select a.TABLE_SCHEMA,a.TABLE_NAME from information_schema.`COLUMNS` a left join (select 'etl_stamp' ...
- 连接两个点云中的字段或数据形成新点云以及Opennni Grabber初识
(1)学习如何连接两个不同点云为一个点云,进行操作前要确保两个数据集中字段的类型相同和维度相等,同时了解如何连接两个不同点云的字段(例如颜色 法线)这种操作的强制约束条件是两个数据集中点的数目必须一样 ...
- js判断类型的方法
//判断类型 var arr=[]; Object.prototype.toString.call(arr)=='[object Array]' //判断是否是包含关系 function elCont ...
- Android-FragmentPagerAdapter刷新无效的解决方案
按照通常使用ListView的习惯做法,如果你只是更新保存Fragment的List数据,然后调用adapter的notifyDataSetChanged()是不会起作用的. 搜索了下发现此问题普遍存 ...
- [redis] redis连接远程客户端查询数据
F:cd redis-2.8.12redis-cli.exe -h 192.168.6.107 -p 16680redis-cli.exe -h 192.168.6.107 -p 16681redis ...