写点什么

android 使用 java 编写网络连通性检查

作者:lichong951
  • 2025-12-02
    北京
  • 本文字数:1317 字

    阅读完需:约 4 分钟

android 使用 java 编写网络连通性检查

下面给出 纯 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,无三方依赖,直接复制即可用。

用户头像

lichong951

关注

还未添加个人签名 2018-12-28 加入

还未添加个人简介

评论

发布
暂无评论
android 使用 java 编写网络连通性检查_android_lichong951_InfoQ写作社区