android - 为什么我的应用程序在互联网关闭时仍然崩溃
问题描述
当互联网关闭时,我的应用程序仍然崩溃,我正在使用诸如 Retrofit 和 OkHttp 配置之类的服务模块,我已经在应用程序清单和服务模块清单上的清单上添加了这些权限,但没有任何效果。
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
但是 crashlytics 正在登录这些错误:
Fatal Exception: java.net.UnknownHostException: Unable to resolve host "api.com.br": No address associated with hostname
Caused by android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
解决方案
您提到的权限对于让您的应用程序访问互联网、访问网络状态和访问 wifi 状态是必要的。但是,用户仍然可以根据需要打开和关闭互联网连接。
如果没有 Internet 连接,您对 api.com.br 的 DNS 查找将失败。
您可以在尝试进行任何网络呼叫之前检查互联网连接并向用户显示错误,以便他们知道打开它以使您的应用程序正常工作。
您可以在此处关注 Google 的 Android 文档,了解如何检查互联网连接。
本质上:
private boolean isNetworkConnected(Context context) {
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
}
此外,您应该计划在进行网络调用时捕获和处理任何与网络相关的异常,并使用它向用户显示有用的错误。
这是因为即使预先检查连接,在您拨打电话后仍有可能出现网络故障。不过,预检查会阻止您拨打您知道会失败的电话。
推荐阅读
- vb.net - EWS Oauth 登录过期,每次应用启动都要登录
- php - 选择总和在 php 和 mysqli 中不起作用
- window.location - 如何在codeandbox.io 中使用window.location.href?
- android - 我在这段代码中正确使用 LiveData 吗?(作品)
- javascript - 温度转换器给了我 NaN
- azure-ad-b2c - 如何将用户添加为来自另一个 IDP 的成员?
- c# - 如何将 HTML 解析为带有样式的文本
- r - 有没有办法在管道工代码中将数据保存为 csv 文件?
- kestrel-http-server - .NET Core 2.2 中的 KestrelServerOptions.ApplicationSchedulingMode
- android - Room 使用 @Relation 注解 - 一对多关系 where 子句子关系