【问题标题】:Kotlin's URL.readText() crashes when I turn my phone's internet off当我关闭手机的互联网时,Kotlin 的 URL.readText() 崩溃
【发布时间】:2020-09-10 15:10:32
【问题描述】:

我正在 AsyncTask 中使用 Kotlin 的 URL.readText() 执行 HTTP 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

【问题讨论】:

  • AsyncTask 已弃用。纯粹使用URL 访问互联网是相当古老的。 OkHttp 将允许您避免这两种情况。但是,这些类型的 API 的工作方式具有相当内在的异常,因此请将您的 I/O 包装在 try/catch 块中。
  • 仅供参考,在多个 StackOverflow 答案中都建议这样做
  • 我会捕获什么异常类?
  • "我会捕获什么异常类?" ——我通常会抓住任何我能合理处理的东西。这可能只是Exception,或者可能是ThrowableException 的超类型)。
  • 好吧,有道理,我猜奇怪的错误信息让我失望了

标签: android kotlin android-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" }

【讨论】:

  • 这里,“FATAL EXCEPTION”只是表示它没有被捕获,而不是它不能被捕获。
猜你喜欢
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 2020-06-07
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
相关资源
最近更新 更多