[英]How to check the connection status in Android avoiding StrictMode
我創建了一個 function,它根據是否存在 inte.net 連接返回 boolean,這個 function 在不同的 java 類中被調用了不同的時間。
我發現使用它的唯一方法是使用StrictMode.setThreadPolicy (我知道這不是一個好的做法)。
我該如何解決我的問題?
public boolean checkConnection() {
boolean response = false;
try {
//StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
URL url = new URL(databaseManagement.getSettingValue("urlCheckConnection", context));
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setConnectTimeout(3000);
httpURLConnection.setReadTimeout(3000);
httpURLConnection.connect();
response = httpURLConnection.getResponseCode() == 200;
httpURLConnection.disconnect();
httpURLConnection.getInputStream().close();
}
}
} catch (Exception e) {
response = false;
wil.WriteFile("checkConnection - Exception: " + e.getMessage(), context);
}
return response;
}
此方法可能會阻塞調用線程長達 3 秒。 一般來說,您不應該在主 (UI) 線程上執行網絡或文件 I/O,因為這會導致應用程序出現無響應(在這種情況下 Android 將生成 ANR 異常)。 您可以使用多種替代方案,具體取決於您的情況。 這里有兩個:
你的問題有點不清楚。
以下是在我的應用程序中檢查 inte.net 連接的方式:
private fun isConnected(): Boolean {
val connMgr = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkInfo: NetworkInfo? = connMgr.activeNetworkInfo
return networkInfo?.isConnected == true
}
它仍應在最新的 Android API 上進行測試,因為存在已知更改,例如,自 Android API 的某些特定版本以來,缺少以編程方式從測試中模擬網絡開\關的選項。
另一方面, StrictMode
用於強制您和所有 rest 軟件開發人員編寫正確的程序。 使用.network 和數據存儲操作的代碼不應該在主線程中執行(默認情況下執行),它應該在單獨的線程中運行。 StrictMode
會跟蹤這一點,並通過日志中的警告消息或使您的應用程序崩潰來通知您違反此做法(我更喜歡第二個,因為它更明顯)。 但是,有時您依賴違反此良好做法的 3rd 方庫,並且保持啟用StrictMode
會阻止您使用此庫。
在任何情況下, StrictMode
通常只在開發階段啟用,如下所示:
if (BuildConfig.DEBUG) {
// TODO enable StrictMode policies
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.