如何检查连接状态在Android避免StrictMode

62lalag4  于 2023-01-28  发布在  Android
关注(0)|答案(2)|浏览(119)

我创建了一个函数,它根据是否存在互联网连接返回一个布尔值,这个函数在不同的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;
}
fjaof16o

fjaof16o1#

此方法可能会阻塞调用线程长达3秒。一般来说,您不应在主(UI)线程上执行网络或文件I/O,因为这可能会导致应用出现无响应(在这种情况下,Android将生成ANR异常)。根据您的情况,您可以使用多种替代方法。以下是两种:

  • 永远不要在主(UI)线程上调用此方法。始终在后台线程上执行Internet连接检查
  • 使方法异步并提供回调接口。调用者将调用该方法(在后台线程上启动连接检查后将立即返回),然后在连接检查完成时触发回调。如果必须在主线程上执行此操作,(UI)线程,您应在执行连接检查时显示进度对话框或类似对话框,以便用户不会认为应用程序卡住。
olhwl3o2

olhwl3o22#

你的问题有点不清楚。
以下是如何在我的应用程序中检查互联网连接:

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是用来强迫你和所有其他的软件开发人员编写正确的程序。你的代码与网络和数据存储操作不应该在主线程中执行(这是默认的),它应该在单独的线程中运行。StrictMode跟踪此操作,并通过日志中的警告消息或使应用程序崩溃来通知您违反此操作(我更喜欢第二个,因为它更明显)。但是,有时您依赖于第3方库,这违反了这个良好的做法,并保持您的StrictMode启用阻止您使用这个库。
在任何情况下,StrictMode通常仅在开发阶段启用,如下所示:

if (BuildConfig.DEBUG) {
  // TODO enable StrictMode policies
}

相关问题