android - 当我关闭手机的互联网时,Kotlin 的 URL.readText() 崩溃
问题描述
我正在 AsyncTask 中使用 Kotlin 执行 HTTP URL.readText()
GET请求。我没有在 UI 线程中犯网络的常见错误,但我的应用程序仍然遇到崩溃。
如果我在关闭互联网的情况下启动我的应用程序或在运行期间关闭互联网,则下次我通过用户输入间接触发 GET 请求时它会崩溃。什么是执行“安全” GET 请求的好方法,例如只返回一个空字符串而不是崩溃?
我将每个调用分开到自己的行中,以确保它readText()
导致崩溃,而不是例如我也使用的 GoogleMap。我还检查了 URL 对象,它不为空。该应用程序不请求任何权限。
任务:
class MyTask(map : GoogleMap, url : String) : AsyncTask<Void, Void, String>() {
val mMap = map;
val mURL = url;
override fun doInBackground(vararg params: Void?): String {
return URL(mURL).readText()
}
... (more code) ...
}
用户界面线程:
MyTask(mMap, url).execute()
日志:
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
解决方案
@CommonsWare 捕获异常的建议对我有用,我认为“致命”意味着它无法被捕获。
override fun doInBackground(vararg params: Void?): String {
return try {
URL(mURL).readText()
} catch (ex : Exception) {
"null"
}
}
更短:
override fun doInBackground(vararg params: Void?): String =
try { URL(mURL).readText() } catch (ex : Exception) { "null" }
推荐阅读
- javascript - 为具有相同类的每个元素触发 JS 代码
- google-api - 如何在不使用服务器带宽的情况下直接从 Google Drive 上传/下载文件到浏览器?
- java - 如何获取在android前台运行的应用程序名称?
- latex - 我如何在 LaTeX 中写这个?
- r - R:获取数据框中每组的最后一行
- google-apps-script - 脚本仅在上传单个文件时有效
- prometheus - 在 Grafana 中设置的 Prometheus 数据源中设置抓取间隔
- bash - 关于 bash 的问题
- r - 如何将辅助 y 轴链接到 ggplot2 中的正确变量?
- javascript - 将道具传递给孩子的孩子 React JS