gpt4 book ai didi

android - 协程解释

转载 作者:行者123 更新时间:2023-12-02 13:28:44 24 4
gpt4 key购买 nike

阅读了很多关于此的内容,但仍有一些不清楚的地方。
这句话:“协程使以同步方式编写异步代码”有点令人困惑。
协程总是异步的。他们基本上一直在线程上运行?由我们决定哪些线程将使用我们声明使用的协程(Mainscope - 它们在 MainThread 上运行,CoroutinesScope - 它将在一些与 UI 线程无关的不同线程上运行?? ViewmodelScope - 它们将在以下线程上运行与 View 模型相关联??)
我做对了吗?

最佳答案

大多数java世界编写异步的传统方式是使用“回调”,他们认为这是通过添加成功和失败的监听器来编写异步任务的唯一方法。
但协程方式略有不同。实际上,您调用了像 delay(ms: Long) 这样的挂起函数它似乎不是异步的,因为这里没有涉及任何回调,但在幕后 Continuation object 将代替回调工作,以便稍后在需要时恢复它。

Coroutines are ALWAYS asynchronus


是的,他们是!

They are basically running on the threads all the time?


是的,他们是!

It is on us to decide which threads will coroutines we declare use


是的,绝对的。他们实现了结构化并发。

Mainscope - they run on MainThread


显然,是的。
public fun MainScope(): CoroutineScope = ContextScope(SupervisorJob() + Dispatchers.Main)
它创建一个 CoroutineScope上下文的调度程序元素为 Dispatchers.Main使子进程默认调度到主线程(未指定时),并附加一个 SupervisorJob使其他 child 不受取消之一的影响。

CoroutinesScope - it will run on some different threads that are not associated with UI thread??


不,由您提供 CoroutineDispatcher CoroutineContext 的元素这将决定它需要将子协程分派(dispatch)到哪个线程,例如有 4 个默认的 CoroutineDispatcher:
  • Dispatchers.Main - 向主线程调度(单线程)
  • Dispatchers.Default - 向 CommonPool 调度(最大线程数与处理器中的内核相同)
  • Dispatchers.IO - 向 CommonPool 调度(最大线程数:64)
  • Dispatchers.Unconfined - 向任何注册的线程调度(通常用于非常小的任务,无论如何不建议使用)

  • 此外,您可以使用 java.util.Executors 制作自己的 CoroutineDispatcher :
    Executors.newFixedThreadPool(4).asCoroutineDispatcher() // Your own dispatcher max of 4-threads
    CoroutineContext 中除了 Dispatcher 之外还有很多其他的元素。比如:Job、CoroutineName、CoroutineInterceptor、CoroutineExceptionHandler 等 我建议阅读 this文章可以更好地可视化 CoroutineContext 的一些最重要的元素正在发生的事情。
    CoroutineScope 只是 CoroutineContext 的一个包装器,它本质上有助于使用 launch 启动协程。或 async ,您可以通过将 CoroutineContext 作为参数传递来创建一个,例如: CoroutineScope(Dispatchers.Default + Job() + CoroutineName("My Coroutine")) .
    注意:CoroutineContext 的所有元素本身就是一个 CoroutineContext,+符号是 plus 的过载在 CoroutineContext 中定义的函数本质上是用右侧 CoroutineContext 中的元素覆盖左侧 CoroutineContext 中的元素(如果左侧不存在元素,它只会添加它)。

    ViewmodelScope - they will run on the threads that are associated with viewmodel??


    ViewModelScope 默认实现 Dispatchers.Main 来启动任务,它们可以更改 UI 元素,因为只有主线程可以更改 UI 元素。
    边注 :您可以在启动之前更改 CoroutineContext 的元素(覆盖范围之一)。
    例子:
    viewModelScope.launch(Dispatchers.Default) {
    // This coroutine is launched under Dispatchers.Default (backed by a CommonPool of threads) instead of Dispatchers.Main
    // but will follow cancellation as soon as lifecycle of Activity associated is destroyed as Job element is not overriden
    }

    关于android - 协程解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62614216/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com