首页 > 解决方案 > 当我关闭手机的互联网时,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

标签: androidkotlinandroid-asynctask

解决方案


@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" }

推荐阅读