Coroutines: a practical vocabulary

栏目: IT技术 · 发布时间: 5年前

内容简介:Coroutines is a powerful feature that makes running async work easy in Kotlin.It's quite easy to get started with coroutines and running work in the non-main thread by copying-pasting code from the web (and most of the time it's fine).If you already did th

Coroutines is a powerful feature that makes running async work easy in Kotlin.

It's quite easy to get started with coroutines and running work in the non-main thread by copying-pasting code from the web (and most of the time it's fine).

If you already did that but you would like to understand the bare basics about those context, scope and other objects you are using  you are reading the right blog post :)

Coroutine Context

A coroutine executes always in a Context . The context is a group of other objects, most notably the Job and Dispatcher which are explained below.

Job

Represents a background job. It's cancellable, and you can arrange jobs in parent-child hierarchies.

When you launch a coroutine within a coroutine, it inherits the Coroutine Context. The Job of the new coroutine becomes child of the parent's coroutine Job. Therefore, when the parent coroutine is canceled, all its children are recursively canceled too.

launch {
    // This coroutine has a Context that contains a Job (a.k.a parent Job).
    [...]
    
    launch {
        // This coroutine's Job, is a child of parent Job
        [...]
    }
}
Launching a child coroutine

Dispatcher

Determines which thread(s) the coroutine uses for the execution.

When launching a child coroutine (as seen above), you can override the Dispatcher by passing it to the launch() method.

launch {
    // This coroutine has a Context that contains a Job and a Dispatcher.
    [...]
    
    launch(Dispatchers.IO) {
        // In this child coroutine the Dispatcher has been overriden.
        [...]
    }
}
Launching a child coroutine and overriding the Dispatcher

To change Dispatcher within the same coroutine, use withContext() (the context  inside the withContext block is the existing context plus the provided) .

launch {
    withContext(Dispatchers.IO) {
        // This is the same coroutine, with the Dispatcher overriden.
    	[...]
    }
}
Switching Dispatcher without launching a coroutine

Coroutine scope

Essentially a class that contains a Coroutine context . It exists to manage the lifecycle of coroutines (without manipulating contexts and jobs manually).

But why have another class if it just contains the context? tl;dr: Because they serve a different purpose ( longer explanation ).

Most of the time, the scope is attached to objects that we want to stop all coroutines they launched when they stop to exist (e.g. Activities, ViewModels, etc).

All the coroutine builders methods you've seen (e.g. launch , async ) are extension methods of Coroutine context .

To use a scope:

  • Create it (and manage it) manually:
class Activity {
    private val mainScope = MainScope()
    
    fun destroy() {
        mainScope.cancel()
    }
    
    fun doSomething() {
        mainScope.launch {
            [...]
        }
    }
 }
  • Use delegation:
class Activity : CoroutineScope by CoroutineScope(Dispatchers.Default) {
    
    fun doSomething() {
        // Note that the scope is implied here
        launch {
            [...]
        }
    }
}
  • Use provided scope:
class MyViewModel : ViewModel() {

    fun doSomething() {
        // Android Jetpack ViewModel, provide a scope attached to VM lifecycle
        viewModelScope.launch {
            [...]
        }
    }
}

Hopefully, these coroutine related concepts are a bit more clear now!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

降维打击

降维打击

杨 健 / 北京时代华文书局 / 2016-10 / 68

“降维打击”出自中国科幻作家刘慈欣的小说《三体》,而笔者在这本书中试图把“降维打击”的思维引入到企业经营管理的实战中,总结出一套“降维打击”的商业理论。 按照笔者的理解,企业竞争力可以体现在若干个维度的累加上,具有高维度思维的企业,主动将竞争对手的某一核心维度的竞争力降为零,并跟对手在自己更具竞争优势的维度内进行竞争,从而实现以小博大、以弱灭强的商业竞争结果,这就是企业竞争中的“降维打击”。......一起来看看 《降维打击》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具