我喜欢使用这两个 IDE 测试编程概念,但是,我不禁注意到 IntelliJ 中的
Main
函数与 Android 中的OnCreate
函数相比有一些不同。
智能
fun main(args: Array<String>) {
val flow = flowOf(1, 2, 3)
println("Before launch")
CoroutineScope(Dispatchers.IO).launch {
println("Launch working")
flow.collect {
println("Collect: $it")
}
}
}
结果
Before launch
这是可以理解的,因为我需要在
join
对象上使用 job
才能让 coroutine
等待 Child coroutine
完成。下面的代码工作正常。
像这样
fun main(args: Array<String>) = runBlocking {
val flow = flowOf(1, 2, 3)
println("Before launch")
var job = CoroutineScope(Dispatchers.IO).launch {
println("Launch working")
flow.collect {
println("Collect: $it")
}
}
job.join()}
但是在 Android Studio
OnCreate
函数中我不需要使用 join
方法来等待 coroutine
完成。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
lifecycleScope.launch(Dispatchers.Main) {
requestNews(GENERAL, generalNews, "us")
requestNews(TECHNOLOGY, TechNews, "us")
requestNews(HEALTH, healthNews, "us")
requestNews(SPORTS, SportsNews, "us")
requestNews(ENTERTAINMENT, EntertainmentNews, "us")
requestNews(SCIENCE, ScienceNews, "us")
requestNews(BUSINESS, BusinessNews, "us")
}
}}
Android Studio中的上述代码
OnCreate
功能有效,所有requests
都已启动。我不必使用job.join
来等待coroutine
。它的工作方式有什么不同吗?
IntelliJ 需要使用
job.join
函数来正确执行子函数 coroutines
而 OnCreate
不需要,我错过了什么吗?
是的。只是一个概念: 当我们谈论 Idea 的应用程序时,它以 main() 函数结束。 但是 Android 应用程序(尤其是 Activity)仍然会运行。
此外,lifecycleScope 绑定到Activity 的生命周期,因此当Activity 被销毁时,您的工作将被取消。因此 onCreate() 不会取消作业。
您在问题描述中混淆了 IDE 和目标平台。
IntelliJ 不是一种应用程序。这是一个用于编写各种应用程序的 IDE。
您可以在 IntelliJ IDEA 中构建 Android 应用程序。
您可以在 Android Studio 中构建 JVM 应用程序(尽管它没有提供专门为此创建项目的新项目向导)。
所以你的问题实际上是关于 JVM 应用程序和 Android 应用程序之间的区别。
JVM 应用程序通过执行
main
函数工作,并在 main
函数返回后终止。因此,如果您不等待就开始一些异步工作,那么应用程序将在异步工作完成之前终止。
Android 应用程序通过查看与启动器关联的活动的应用程序清单来工作。然后构造关联的 Activity 子类并设置其 Context 和其他依赖项,然后开始其生命周期,其中包括
onCreate()
功能。 Activity 不会终止,直到某些用户操作(例如退出它或旋转屏幕,或者您调用 finish()
)。应用程序进程(托管活动)在操作系统决定或用户通过 Android 设置强制关闭它之前不会终止。
这是对 Android 工作方式的简化。应用程序甚至不一定需要有任何启动器活动。它可能只是一种服务。而且启动器活动并不是应用程序启动的唯一方式。