我创建了一个函数,它根据是否存在互联网连接返回一个布尔值,这个函数在不同的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;
}
2条答案
按热度按时间fjaof16o1#
此方法可能会阻塞调用线程长达3秒。一般来说,您不应在主(UI)线程上执行网络或文件I/O,因为这可能会导致应用出现无响应(在这种情况下,Android将生成ANR异常)。根据您的情况,您可以使用多种替代方法。以下是两种:
olhwl3o22#
你的问题有点不清楚。
以下是如何在我的应用程序中检查互联网连接:
仍应在最新的Android API上进行测试,因为存在已知变更,例如,自Android API的某些特定版本以来,缺少通过测试以编程方式模拟网络开/关的选项。
另一方面,
StrictMode
是用来强迫你和所有其他的软件开发人员编写正确的程序。你的代码与网络和数据存储操作不应该在主线程中执行(这是默认的),它应该在单独的线程中运行。StrictMode
跟踪此操作,并通过日志中的警告消息或使应用程序崩溃来通知您违反此操作(我更喜欢第二个,因为它更明显)。但是,有时您依赖于第3方库,这违反了这个良好的做法,并保持您的StrictMode
启用阻止您使用这个库。在任何情况下,
StrictMode
通常仅在开发阶段启用,如下所示: