在异步执行任务时,在Android上阻止主线程



我一直在努力理解Android上的多线程V异步编程之间的区别。主要是,为什么需要从主线程中删除长期运行的任务,即使该任务与Coroutine之类的任务不同步。

鉴于我的解释是,即使长期运行的任务可能是异步的,但在UI线程上仍然可以完成。因此,即使异步代码没有阻止,这也是重要的,而不是阻止它。这似乎很有意义。

但是,也许只是我不知道的语言的细微差别,但是像JavaScript这样的单个螺纹语言无法委派它的作用也不同步,但是您可以长期运行JavaScript中的任务是异步函数,并且永远不会遇到任何错误,表示您在主线程上进行了太多工作,并从中看到UI性能命中。

为什么即使暂停了任务,而不是像JavaScript这样的语言,为什么您仍然必须从Android上的主线程中取出代码?

为什么即使任务已暂停

,您仍然必须从Android上的主线程中取出代码

你不。唯一的规则是

从主线程事件队列中采取的任何单个事件都不应花费很长时间才能处理。

"长"可能是一毫秒或两毫秒以上的一切。

如果您在事件处理程序中执行阻止操作,则计入该事件处理程序执行的持续时间。

如果您在事件处理程序中执行非阻滞性,异步操作,则处理程序实际上在启动操作后立即完成,确保稍后将在队列上放置另一个事件准备就绪。

这是合作与抢先的多线程的本质:在前一种情况下,用户代码负责将总任务切成几个轻量级事件,而在后一种情况下,无论代码在做什么,操作系统都会执行它。由于整个GUI必须在单个线程上运行,因此不是一个选项。

因此,特别是,在Kotlin中,您可以写

launch(Dispatchers.Main) {
    val user = makeRestCall("/users/$id")
    usernameText.text = user.name
}

使用一些suspend fun makeRestCall(url: String)

最新更新