簡體   English   中英

如何在Android中查看連接狀態避開StrictMode

[英]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 異常)。 您可以使用多種替代方案,具體取決於您的情況。 這里有兩個:

  • 永遠不要在主 (UI) 線程上調用此方法。 始終在后台線程上執行您的 Inte.net 連接檢查
  • 使方法異步並提供回調接口。 然后,調用者將調用該方法(該方法將在后台線程上啟動連接檢查后立即返回),然后在連接檢查完成時觸發回調。 如果這必須在主 (UI) 線程上完成,您應該在執行連接檢查時顯示進度對話框或類似內容,這樣用戶就不會認為應用程序卡住了。

你的問題有點不清楚。

以下是在我的應用程序中檢查 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM