本文主要是介绍Android使用java实现网络连通性检查详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...
下面给出 纯 Java 代码、兼容 Android API 19+、零三方库 的“网络连通性检查”工具类。 特点:
- 同时检测 Wi-Fi/移动数据是否真正上网(不只是“已连接”)
- 使用 HttpURLConnection,不阻塞主线程
- 支持 超时设置(秒级)
- 返回 布尔结果 + 失败原因日志
NetCheck.java(可直接拷贝)
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import androhttp://www.chinasem.cnid.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();
}
/* ========== 内部实现 ========== *php/
/* 1. 系统是否声明已连接 */
private static boolean isConnected(Context ctx) {
ConnectivityManager cm = (ConnectivityMwww.chinasem.cnanager)
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 {
// ① 国内通用、响应快;② 支China编程持 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.onResulandroidt(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检查网络连通性内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!
这篇关于Android使用java实现网络连通性检查详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!