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() ...
随机推荐
- 解析Delphi 窗口置顶,及非主窗口置顶
方法一: procedure TForm1.Button2Click(Sender: TObject);begin Form2.Show; Application.NormalizeTopMosts; ...
- C#学习笔记(11)——深入事件,热水器案例
说明(2017-6-14 15:04:13): 1. 热水器案例,为了便于理解,采用了蹩脚但直观的英文命名,哼哼. heater类,加热,声明一个委托,定义一个委托事件: using System; ...
- Android基础——Fragment与Activity交互
今天继续讲解Fragment组件的特性,主要是跟Activity的交互和生命周期的关系,我们前面已经说过Fragment是依赖于Activity的,而且生命周期也跟Activity绑定一起.下面我们看 ...
- [转]MySQL函数大全 及用法示例
原文地址:http://blog.sina.com.cn/s/blog_4586764e0100h5ct.html 1.字符串函数ascii(str) 返回字符串str的第一个字符的ascii值( ...
- [Linux实用工具]Windows下同步Linux文件(Linux安装Samba和配置)
场景需求: 安装了Ubuntu在虚拟机上,但是代码编辑或者其它更多的操作的时候,还是习惯在windows下进行.如果windows下编辑完再上传到服务器,再编译执行,就太繁琐了.一次两次还好说,这编译 ...
- How Not to Crash #3: NSNotification通知引起的崩溃
How Not to Crash #3: NSNotification通知引起的崩溃html, body {overflow-x: initial !important;}html { font-si ...
- C语言 · 集合运算
算法训练 集合运算 时间限制:1.0s 内存限制:512.0MB 问题描述 给出两个整数集合A.B,求出他们的交集.并集以及B在A中的余集. 输入格式 第一行为一个整数n,表示集合A中的 ...
- C语言 · 字串逆序
算法训练 字串逆序 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个字符串,将这个串的所有字母逆序后输出. 输入格式 输入包含一个字符串,长度不超过100,字符串中不 ...
- elasticsearch 服务安全配置
elasticsearch安装与使用(5)-- search guard安装与配置 一.安装search guard插件必须要安装两部分: ①search-guard-xx ②search-gua ...
- python里面有人写while 循环用 用while 1 和while True的区别
由于Python2中,True/False不是关键字,因此我们可以对其进行任意的赋值,这就导致程序在每次循环时都需要对True/False的值进行检查:而对于1,则被程序进行了优化,而后不会再进行检查 ...