当前位置: 代码网 > it编程>编程语言>Java > Android使用java实现网络连通性检查详解

Android使用java实现网络连通性检查详解

2025年12月02日 Java 我要评论
下面给出 纯 java 代码、兼容 android api 19+、零三方库 的“网络连通性检查”工具类。 特点:同时检测 wi-fi/移动数据是否真正上网(不只是&ldquo

下面给出 纯 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检查网络连通性内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com