当前位置: 首页 > 知识库问答 >
问题:

CoroutineScope(job+dispatchers.main)如何在main/UI线程上运行?

万修然
2023-03-14

共有1个答案

和和裕
2023-03-14

我的猜测是,这类似于JavaScript使用事件循环管理阻塞操作的方式

是的,这是正确的,事件循环是必要的使协同工作。基本上,当你这样写的时候:

uiScope.launch {
    delay(1000)
    println("A second has passed")
}

它编译成与以下内容具有相同效果的代码:

Handler(Looper.mainLooper()).postDelayed(1000) { println("A second has passed") }

它的主要概念是continuation,这是一个实现状态机的对象,该状态机与您在可挂起函数中编写的顺序代码相对应。当您调用delay或任何其他可挂起函数时,continuation的入口点方法将返回一个特殊的COROUTINE_SUSUPEND值。稍后,当一些外部代码得到suspendable函数的返回值时,它必须调用continuation.resume(result)。这个调用将被负责的调度程序拦截,它将把这个调用作为一个事件发布到GUI事件循环中。当事件处理程序出列并执行时,您就回到了状态机中,状态机将确定在何处继续执行。

 类似资料:
  • 我有一个ScheduleTimer类,它可以处理日期数组。这是: 如果我像Java应用程序一样运行它,而不是像android一样运行,并且它在控制台中每隔一秒打印一次,那么它就可以正常工作。但是当在android环境中运行它时,它要么说UI线程不能从任何其他线程接触,要么它在类ScheduleTimer的方法中给了我null点异常。 我这样使用它:

  • 问题内容: 我有一个需要从服务器提取数据并将其插入到SQLite数据库中以响应用户输入的应用程序。我认为这将非常简单- 从服务器提取数据的代码是AsyncTask的一个非常简单的子类,并且它的工作原理完全符合我的预期,而无需挂起UI线程。我使用一个简单的接口为其实现了回调功能,并将其包装在静态类中,因此我的代码如下所示: 一切还不错。即使服务器花费一个小时来检索数据,UI仍然可以平稳运行,因为ge

  • 问题内容: 我正在使用java.lang.Object中的wait()的定时版本,并观察到它在两种不同的情况下的行为不同。 方案1:在线程中使用run()的默认定义 方案1的问题: 我在X和Y之间遇到延迟。这是因为我正在从main调用wait()(即使在t上),因此正在使用主线程的调用堆栈,而不是主线程的调用堆栈。第二个线程? 方案2:动态 子类化Thread以重写run()以便打印内容。 关于方

  • 在java.util.scanner.throwfor(Scanner.java:862) 在java.util.scanner.next(Scanner.java:1485) 在java.util.scanner.nextint(Scanner.java:2117) 在java.util.scanner.nextint(Scanner.java:2076) 在myclass.main(Mycla

  • 我在尝试运行程序时出现以下错误。这实际上是Hackerrank“第六天让我们回顾”挑战的提交。 线程“main”java中出现异常。util。java的NoTouchElementException。util。扫描仪。throwFor(Scanner.java:862)访问java。util。扫描仪。下一步(Scanner.java:1371)是解决方案。main(Solution.java:10

  • 嗨,我是swift的新手,我想在后台运行一个函数,我的问题是一旦函数运行漏洞应用程序冻结,我就不能使用该界面,直到函数结束。 是一个按钮,它将调用函数用于流式传输相机,然后它将当前视图移动到以查看相机界面。 下面是我用来调用函数的内容: 有什么建议吗?