首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >android 使用 java 编写网络连通性检查

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

原创
作者头像
lichong951
修改2025-12-03 14:48:10
修改2025-12-03 14:48:10
2050
举报

下面给出 纯 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() {}
  }undefined✅ 使用示例(Activity/Fragment 内)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,无三方依赖,直接复制即可用。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ✅ NetCheck.java(可直接拷贝)
  • ⚠️ 权限要求(AndroidManifest.xml)
  • 🔧 如需同步调用(阻塞)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档