博客 / 詳情

返回

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,無三方依賴,直接複製即可用。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.