安卓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连接,测试网络请求,解析域名的更多相关文章

  1. Android之三种网络请求解析数据(最佳案例)

    AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...

  2. (转载)Android之三种网络请求解析数据(最佳案例)

    [置顶] Android之三种网络请求解析数据(最佳案例) 2016-07-25 18:02 4725人阅读 评论(0) 收藏 举报  分类: Gson.Gson解析(1)  版权声明:本文为博主原创 ...

  3. Android Studio 模拟器(AVD)访问互联网

    模拟器默认是不可以直接访问互联网的,需要为模拟器配置 DNS 服务器. (一)找到模拟器安装的位置 模拟器安装位置在安卓 SDK 下面,进入[SDK Path]/emulator. (二)打开终端输入 ...

  4. 基于Android Volley的网络请求工具

    基于Android Volley的网络请求工具. 一.说明 AndroidVolley,Android Volley核心库及扩展工程.AndroidVolleySample,网络请求工具示例工程.Re ...

  5. Android异步加载访问网络图片-解析json

    来自:http://www.imooc.com/video/7871 推荐大家去学习这个视频,讲解的很不错. 慕课网提供了一个json网址可以用来学习:http://www.imooc.com/api ...

  6. Android 使用 HTTP 协议访问网络

    正在看<第一行代码>,记录一下使用 HTTP 协议访问网络的内容吧! 在Android发送Http请求有两种方式,HttpURLConnection和HttpClient. 1.使用Htt ...

  7. nginx只允许移动端访问( 判断拦截pc浏览器访问)

    set $mobile_request '0'; if ($http_user_agent ~* (Android|webOS|iPhone|iPod|BlackBerry)) { set $mobi ...

  8. Android中的各种访问权限Permission含义

    android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序 android. ...

  9. Android使用Http协议访问网络——HttpConnection

    套路篇 使用HttpConnection访问网络一般有如下的套路: 1.获取到HttpConnection的实例,new出一个URL对象,并传入目标的网址,然后调用一下openConnection() ...

随机推荐

  1. Node.js学习笔记(1)--一个最简单的服务器请求

    说明(2017-5-2 10:27:03): 1. 需要安装node,http://nodejs.cn/download/ 2. 安装完后,在cmd里输入node -v可以查看版本. 3. 代码foo ...

  2. C语言 · 彩票

    算法提高 彩票   时间限制:1.0s   内存限制:256.0MB      问题描述 为丰富男生节活动,贵系女生设置彩票抽奖环节,规则如下: 1.每张彩票上印有7个各不相同的号码,且这些号码的取值 ...

  3. [strace]跟踪进程的系统调用

    转自:https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html 简介 strace常用来跟踪进程执行时的系统调用和所接收的信号 ...

  4. tomcat添加context方式部署web应用

    刚巧碰到了,记录一下. 通过context的方式部署会灵活一点,不必一定指向tomcat里面的webapps目录 这种部署有几种方式: 1.在$CATALINA_BASE/conf/ server.x ...

  5. .net dll类库 生成chm说明文档

    效果图: 制作步骤: 1.下载Sandcastle http://shfb.codeplex.com/releases/view/105809 2.下载Html Help WorkShop http: ...

  6. 【html】关于锚点的一些事

    今天修改公会系统,有用到锚点对页面位置进行控制,结果碰到了一些问题,通过查询相关资料解决了,在这里总结下. 两种方法跳转到锚点: 1.给锚点添加 name 属性和 id 属性.一般只要加 name 就 ...

  7. 标签<view>文字自动换行

    <view style='word-break:break-all;'>{{con.blog}}</view>

  8. asp.net http请求图

    从网上看到的一些资源结合理解画出请求 没有详细细分,大体步骤请求如下图

  9. JS中eval处理JSON数据 为什么要加括号

    由于Ajax的兴起,JSON这种轻量级的数据格式作为客户端与服务器之间的传输格式逐渐地流行起来,进而出现的问题是如何将服务器端构建好的JSON数据转化为可用的JavaScript对象.利用eval函数 ...

  10. 关于Dijkstra算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...