我喜欢使用这两个IDE来测试编程概念,然而,我不禁注意到IntelliJ中的Main
函数与Android中的OnCreate
函数有一些不同。
IntelliJ
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
这是可以理解的,因为我需要在job
对象上使用join
,以便让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
没有,我错过了什么吗?
2条答案
按热度按时间cetgtptt1#
您在问题描述中混淆了IDE和目标平台。
所以你的问题实际上是关于JVM应用程序和Android应用程序之间的区别。
JVM应用程序通过执行
main
函数来工作,一旦main
函数返回,它就会终止。因此,如果您在没有等待的情况下开始一些异步工作,那么应用程序将在异步工作完成之前终止。Android应用通过查看应用的清单来查找与启动器关联的Activity。然后,它构造关联的Activity子类,并设置其Context和其他依赖项,然后开始其生命周期,其中包括
onCreate()
函数。Activity不会终止,直到用户执行某些操作,如退出或旋转屏幕,或调用finish()
。应用程序进程(承载活动)不会终止,直到操作系统决定终止,或者用户通过Android设置强制关闭它。这是对Android工作方式的简化。应用程序甚至不一定需要有任何启动器活动。这可能只是一个服务。启动器活动并不是启动应用程序的唯一方式。
ufj5ltwl2#
是的。只有一个概念:当我们谈论Idea的应用程序时,它以
main()
函数结束。但Android应用程序(尤其是Activity
)仍将运行。此外,
lifecycleScope
绑定到Activity
生存期,因此当Activity
被销毁时,您的作业将被取消。因此onCreate()
不会取消作业。