Android使用java實(shí)現(xiàn)網(wǎng)絡(luò)連通性檢查詳解
下面給出 純 Java 代碼、兼容 Android API 19+、零三方庫(kù) 的“網(wǎng)絡(luò)連通性檢查”工具類。 特點(diǎn):
- 同時(shí)檢測(cè) Wi-Fi/移動(dòng)數(shù)據(jù)是否真正上網(wǎng)(不只是“已連接”)
- 使用 HttpURLConnection,不阻塞主線程
- 支持 超時(shí)設(shè)置(秒級(jí))
- 返回 布爾結(jié)果 + 失敗原因日志
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);
}
/** 對(duì)外入口:主線程調(diào)用,回調(diào)仍在主線程 */
public static void isOnline(Context ctx, Callback cb) {
if (!isConnected(ctx)) {
cb.onResult(false);
return;
}
// 真正發(fā) HTTP 探活
new PingTask(cb).execute();
}
/* ========== 內(nèi)部實(shí)現(xiàn) ========== */
/* 1. 系統(tǒng)是否聲明已連接 */
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 {
// ① 國(guó)內(nèi)通用、響應(yīng)快;② 支持 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 內(nèi))
NetCheck.isOnline(this, ok -> {
if (ok) {
// 真正連網(wǎng)
} else {
Toast.makeText(this, "網(wǎng)絡(luò)不可用", Toast.LENGTH_SHORT).show();
}
});
權(quán)限要求(AndroidManifest.xml)
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/>
如需同步調(diào)用(阻塞)
把 PingTask 里的代碼抽出來直接跑即可,但 嚴(yán)禁在主線程執(zhí)行,否則 Android 7.0+ 會(huì)拋 NetworkOnMainThreadException。
一句話總結(jié) 上面 NetCheck.isOnline() 兼顧“是否連網(wǎng)”+“能否上網(wǎng)”,兼容 API 19,無三方依賴,直接復(fù)制即可用。
到此這篇關(guān)于Android使用java實(shí)現(xiàn)網(wǎng)絡(luò)連通性檢查詳解的文章就介紹到這了,更多相關(guān)Android java檢查網(wǎng)絡(luò)連通性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Flutter banner_view 輪播圖的使用及實(shí)現(xiàn)代碼
這篇文章主要介紹了Flutter banner_view 輪播圖的使用及實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07
RxJava之網(wǎng)絡(luò)請(qǐng)求最常見的三種場(chǎng)景
本文想闡述一下當(dāng)你開發(fā)Android應(yīng)用并采用RxJava作為你的架構(gòu),尤其是有關(guān)網(wǎng)絡(luò)請(qǐng)求時(shí)最常見的三種場(chǎng)景。這篇文章主要介紹了RxJava之網(wǎng)絡(luò)請(qǐng)求最常見的三種場(chǎng)景,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
在Android設(shè)備上搭建Web服務(wù)器的方法
本篇文章主要介紹了在Android設(shè)備上搭建Web服務(wù)器的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04
Android編程實(shí)現(xiàn)仿易信精美彈出框效果【附demo源碼下載】
這篇文章主要介紹了Android編程實(shí)現(xiàn)仿易信精美彈出框效果,涉及Android窗口及動(dòng)畫操作相關(guān)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-01-01
Android實(shí)現(xiàn)網(wǎng)絡(luò)圖片瀏覽器
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)網(wǎng)絡(luò)圖片瀏覽器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05

