【问题标题】:How to properly use the URL with Kotlin Android如何在 Kotlin Android 中正确使用 URL
【发布时间】:2017-12-25 20:53:28
【问题描述】:

我想用

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val json = URL("https://my-api-url.com/something").readText()
    simpleTextView.setText(json)
}

但是发生了这个致命错误

FATAL EXCEPTION: main
    Process: com.mypackage.randompackage, PID: 812
    java.lang.RuntimeException: Unable to start activity ComponentInfo{ ***.MainActivity}: android.os.NetworkOnMainThreadException

如何简单地从 URL 链接读取 JSON? async函数的包不存在。

【问题讨论】:

    标签: android kotlin kotlin-android-extensions kotlin-extension


    【解决方案1】:

    Android 不允许从主线程访问互联网。 解决此问题的最简单方法是在后台线程上打开 URL。

    类似这样的:

    Executors.newSingleThreadExecutor().execute({
                val json = URL("https://my-api-url.com/something").readText()
                simpleTextView.post { simpleTextView.text = json }
            })
    

    别忘了在 Android Manifest 文件中注册 Internet 权限。

    【讨论】:

    • 如果有人想知道究竟要在 Android Manifest 文件中放入什么,这对我有用。 它在 标签内但在 标签外
    • 不错的简单解决方案,无需添加依赖项。在 kotlin 中尝试做这样简单的事情时,在线文档的碎片化程度令人震惊——我试图让 anko 和 kotlin 协程工作但没有任何成功。
    • 我花了好几个小时才找到解决我的简单问题的方法,就是这样,非常感谢!!
    【解决方案2】:

    你可以使用协程:

    val json = async(UI) {
            URL("https://my-api-url.com/something").readText()
        }
    

    记得在 build.gradle 中添加协程:

    kotlin {
    experimental {
            coroutines "enable"
        }
    }
    ...
    dependencies {
        implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinx_coroutines_version"
        implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_coroutines_version"
    ...
    }
    

    Coroutines 太棒了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 2022-12-31
      • 2020-04-08
      • 1970-01-01
      • 2021-08-05
      • 2017-08-25
      • 1970-01-01
      相关资源
      最近更新 更多