IntelliJ与Android Studio中的异步编程

soat7uwm  于 2023-05-12  发布在  Android
关注(0)|答案(2)|浏览(213)

我喜欢使用这两个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没有,我错过了什么吗?

cetgtptt

cetgtptt1#

您在问题描述中混淆了IDE和目标平台。

  • IntelliJ不是一种应用程序。这是一个用于编写各种应用程序的IDE。
  • 您可以在IntelliJ IDEA中构建Android应用程序。
  • 您可以在Android Studio中构建JVM应用(尽管它没有提供专门用于创建项目的新项目向导)。

所以你的问题实际上是关于JVM应用程序和Android应用程序之间的区别。
JVM应用程序通过执行main函数来工作,一旦main函数返回,它就会终止。因此,如果您在没有等待的情况下开始一些异步工作,那么应用程序将在异步工作完成之前终止。
Android应用通过查看应用的清单来查找与启动器关联的Activity。然后,它构造关联的Activity子类,并设置其Context和其他依赖项,然后开始其生命周期,其中包括onCreate()函数。Activity不会终止,直到用户执行某些操作,如退出或旋转屏幕,或调用finish()。应用程序进程(承载活动)不会终止,直到操作系统决定终止,或者用户通过Android设置强制关闭它。
这是对Android工作方式的简化。应用程序甚至不一定需要有任何启动器活动。这可能只是一个服务。启动器活动并不是启动应用程序的唯一方式。

ufj5ltwl

ufj5ltwl2#

是的。只有一个概念:当我们谈论Idea的应用程序时,它以main()函数结束。但Android应用程序(尤其是Activity)仍将运行。
此外,lifecycleScope绑定到Activity生存期,因此当Activity被销毁时,您的作业将被取消。因此onCreate()不会取消作业。

相关问题