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

下面给出 纯 Java 代码兼容 Android API 19+零三方库 的"网络连通性检查"工具类。 特点:

  • 同时检测 Wi-Fi/移动数据是否真正上网(不只是"已连接")
  • 使用 HttpURLConnection,不阻塞主线程
  • 支持 超时设置(秒级)
  • 返回 布尔结果 + 失败原因日志

✅ NetCheck.java(可直接拷贝)

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 内)

java 复制代码
NetCheck.isOnline(this, ok -> {
    if (ok) {
        // 真正连网
    } else {
        Toast.makeText(this, "网络不可用", Toast.LENGTH_SHORT).show();
    }
});

⚠️ 权限要求(AndroidManifest.xml)

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

相关推荐
小码哥_常11 分钟前
从MVC到MVI:一文吃透架构模式进化史
前端
嗷o嗷o12 分钟前
Android BLE 的 notify 和 indicate 到底有什么区别
前端
豹哥学前端15 分钟前
别再背“var 提升,let/const 不提升”了:揭开暂时性死区的真实面目
前端·面试
小雅痞20 分钟前
[Java][Leetcode simple] 28. 找出字符串中第一个匹配项的下标
java·开发语言·leetcode
likerhood24 分钟前
java中的不可变类(Immutable)
java·开发语言
lar_slw1 小时前
k8s部署前端项目
前端·容器·kubernetes
拉拉肥_King1 小时前
Ant Design Table 横向滚动条神秘消失?我是如何一步步找到真凶的
前端·javascript
GreenTea1 小时前
DeepSeek-V4 技术报告深度分析:基础研究创新全景
前端·人工智能·后端
yaoxin5211231 小时前
389. Java IO API - 获取文件名
java·开发语言·python
Wang15302 小时前
Java排序
java