安卓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. C#学习笔记(6)——大项目增删改查

    说明(2017-5-28 11:35:39): 1. 需要注意的地方很多 2. 首先是连接字符串str要直接写在类里面,不然每个按钮里面都要写一遍. 3. 查询用到sqlDataReader等三个方法 ...

  2. 元组(Tuple)

    元组(Tuple) 笛卡尔积中每一个元素(d1,d2,…,dn)叫作一个n元组(n-tuple)或简称元组. 元组是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组 ...

  3. android中LayoutParams设置参数的理解

    1. 有这样的一个应用场景:有一个linearLayout控件在其中布局一个textView控件 首先,创建线性布局对象 LinearLayout layout = new LinearLayout( ...

  4. CSS一个元素同时使用多个类选择器(class selector)

    CSS类选择器参考手册 一个元素同时使用多个类选择器 CSS中类选择器用点号表示.实际项目中一个div元素为了能被多个样式表匹配到(样式复用),通常div的class中由好几段组成,如<div ...

  5. C语言 · 身份证排序

    算法提高 身份证排序   时间限制:1.0s   内存限制:256.0MB      问题描述 安全局搜索到了一批(n个)身份证号码,希望按出生日期对它们进行从大到小排序,如果有相同日期,则按身份证号 ...

  6. JDK自带观察者的使用

    被观察者 package observerForJDK; import java.util.Observable; /** * 新闻派发器,当有新的新闻时派发给所有的订阅读者(观察者) */ publ ...

  7. c# 读取excel数据的两种方法

    转载自:http://developer.51cto.com/art/201302/380622.htm, 方法一:OleDb: 用这种方法读取Excel速度还是非常的快的,但这种方式读取数据的时候不 ...

  8. java replaceall 使用正则表达式替换单等号,不替换其他相关的等号。

    写项目需要将公式配置到数据库中,取出后根据公式规则进行比较,由于公式的等于是用单等号,在java中无法直接使用,故需要将单等号替换成双等号,单又不能影响大于等于以及其他形式.故果断选择正则表达式替换. ...

  9. 编译和运行java文件 找不到或无法加载主类

    这边提供一个关于程序中含有package关键字,使用“终端”运行程序时出现“找不到或无法加载主类”,而使用Eclipse软件可以正常运行程序的可能解决办法. 例如程序名为HelloWorldTest. ...

  10. kinect2的标定

    我用的是ubuntu14.04LTS,ROS 版本是indigo,kinect v2,我是用双系统装的ubuntu,关于怎么使用安装kinect2的安装以及使用的都在github上有着详细的说明 Ki ...