格德米斯 發表於 2025-12-2 15:15:10

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>NetCheck.java(可直接拷贝)</li><li>使用示例(Activity/Fragment 内)</li><li>权限要求(AndroidManifest.xml)</li><li>如需同步调用(阻塞)</li></ul></div><p>下面给出 <strong>纯 Java 代码</strong>、<strong>兼容 Android API 19+</strong>、<strong>零三方库</strong> 的&ldquo;网络连通性检查&rdquo;工具类。 特点:</p>
<ul><li>同时检测 <strong>Wi-Fi/移动数据是否真正上网</strong>(不只是&ldquo;已连接&rdquo;)</li><li>使用 <strong>HttpURLConnection</strong>,不阻塞主线程</li><li>支持 <strong>超时设置</strong>(秒级)</li><li>返回 <strong>布尔结果 + 失败原因日志</strong></li></ul>
<p class="maodian"></p><h2>NetCheck.java(可直接拷贝)</h2>
<div class="jb51code"><pre class="brush: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 &amp;&amp; info.isConnected();
    }

    /* 2. 异步探活,避免 ANR */
    private static class PingTask extends AsyncTask&lt;Void, Void, Boolean&gt; {
      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 &gt;= 200 &amp;&amp; code &lt; 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() {}
}
</pre></div>
<p class="maodian"></p><h2>使用示例(Activity/Fragment 内)</h2>
<div class="jb51code"><pre class="brush:java;">NetCheck.isOnline(this, ok -&gt; {
    if (ok) {
      // 真正连网
    } else {
      Toast.makeText(this, "网络不可用", Toast.LENGTH_SHORT).show();
    }
});
</pre></div>
<p class="maodian"></p><h2>权限要求(AndroidManifest.xml)</h2>
<div class="jb51code"><pre class="brush:xml;">&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/&gt;
&lt;uses-permission android:name="android.permission.INTERNET"/&gt;
</pre></div>
<p class="maodian"></p><h2>如需同步调用(阻塞)</h2>
<p>把 <code>PingTask</code> 里的代码抽出来直接跑即可,但 <strong>严禁在主线程执行</strong>,否则 Android 7.0+ 会抛 <code>NetworkOnMainThreadException</code>。</p>
<p>一句话总结 上面 <code>NetCheck.isOnline()</code> 兼顾&ldquo;是否连网&rdquo;+&ldquo;能否上网&rdquo;,兼容 API 19,无三方依赖,直接复制即可用。</p>
<p>到此这篇关于Android使用java实现网络连通性检查详解的文章就介绍到这了,更多相关Android java检查网络连通性内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Java/Android 获取网络重定向文件的真实URL的示例代码</li><li>AndroidRetrofit和Rxjava的网络请求</li><li>Android实现网络访问拦截器的常见方式</li><li>Android获取WiFi网络列表的流程步骤</li><li>Android获取网络连接状态新方法整理</li><li>一文带你了解Android中的网络请求</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Android使用java实现网络连通性检查详解