下面给出 纯 java 代码、兼容 android api 19+、零三方库 的“网络连通性检查”工具类。 特点:
- 同时检测 wi-fi/移动数据是否真正上网(不只是“已连接”)
- 使用 httpurlconnection,不阻塞主线程
- 支持 超时设置(秒级)
- 返回 布尔结果 + 失败原因日志
netcheck.java(可直接拷贝)
import android.content.context;
import android.net.connectivitymanager;
import android.net.networkinfo;
import android.os.asynctask;
import java.net.httpurlconnection;
import java.net.url;
public final class netcheck {
public interface callback {
void onresult(boolean ok);
}
/** 对外入口:主线程调用,回调仍在主线程 */
public static void isonline(context ctx, callback cb) {
if (!isconnected(ctx)) {
cb.onresult(false);
return;
}
// 真正发 http 探活
new pingtask(cb).execute();
}
/* ========== 内部实现 ========== */
/* 1. 系统是否声明已连接 */
private static boolean isconnected(context ctx) {
connectivitymanager cm = (connectivitymanager)
ctx.getsystemservice(context.connectivity_service);
networkinfo info = cm.getactivenetworkinfo();
return info != null && info.isconnected();
}
/* 2. 异步探活,避免 anr */
private static class pingtask extends asynctask<void, void, boolean> {
private final callback cb;
pingtask(callback cb) { this.cb = cb; }
@override
protected boolean doinbackground(void... voids) {
httpurlconnection conn = null;
try {
// ① 国内通用、响应快;② 支持 head,省流量
conn = (httpurlconnection) new url("https://www.baidu.com").openconnection();
conn.setrequestmethod("head");
conn.setconnecttimeout(3_000);
conn.setreadtimeout(3_000);
int code = conn.getresponsecode();
return (code >= 200 && code < 400);
} catch (exception e) {
e.printstacktrace();
return false;
} finally {
if (conn != null) conn.disconnect();
}
}
@override
protected void onpostexecute(boolean ok) {
cb.onresult(ok);
}
}
private netcheck() {}
}
使用示例(activity/fragment 内)
netcheck.isonline(this, ok -> {
if (ok) {
// 真正连网
} else {
toast.maketext(this, "网络不可用", toast.length_short).show();
}
});
权限要求(androidmanifest.xml)
<uses-permission android:name="android.permission.access_network_state"/> <uses-permission android:name="android.permission.internet"/>
如需同步调用(阻塞)
把 pingtask 里的代码抽出来直接跑即可,但 严禁在主线程执行,否则 android 7.0+ 会抛 networkonmainthreadexception。
一句话总结 上面 netcheck.isonline() 兼顾“是否连网”+“能否上网”,兼容 api 19,无三方依赖,直接复制即可用。
到此这篇关于android使用java实现网络连通性检查详解的文章就介绍到这了,更多相关android java检查网络连通性内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论