Kotlin-Coroutines中的async與await異步協(xié)程管理
Coroutines
什么是協(xié)程?(摘自官網(wǎng))
- Asynchronous or non-blocking programming is an important part of the development landscape. 用于異步或非阻塞 編程。
簡單概括
- 同步的方式去編寫異步執(zhí)行的代碼
- 協(xié)程依賴于線程
- 協(xié)程掛起時(shí)不需要阻塞線程,幾乎是無代價(jià)的.
- 一個(gè)線程中可以創(chuàng)建N個(gè)協(xié)程
協(xié)程的創(chuàng)建/啟動(dòng)
- runBlocking 啟動(dòng)一個(gè)新的協(xié)程并阻塞調(diào)用它的線程
- launch:Job 啟動(dòng)一個(gè)協(xié)程但不會(huì)阻塞調(diào)用線程(CoroutineScope作用域內(nèi)調(diào)用)
- async:Deferred<T> 啟動(dòng)一個(gè)協(xié)程但不會(huì)阻塞調(diào)用線程(CoroutineScope作用域內(nèi)調(diào)用)
協(xié)程作用域(CoroutineScope)
GlobalScope 全局頂級(jí)協(xié)程 (現(xiàn)在 GlobalScope 類已被 @DelicateCoroutinesApi 注解所標(biāo)記) 全局范圍
啟動(dòng)一個(gè)協(xié)程:

CoroutineScope https://developer.android.com/topic/libraries/architecture/coroutines
MainScope 主線程的作用域,全局范圍
lifecycleScope 生命周期范圍,用于activity等有生命周期的組件,DESTROYED結(jié)束。
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
val params = TextViewCompat.getTextMetricsParams(textView)
val precomputedText = withContext(Dispatchers.Default) {
PrecomputedTextCompat.create(longTextContent, params)
}
TextViewCompat.setPrecomputedText(textView, precomputedText)
}
}
}
- viewModelScope:viewModel范圍,ViewModel被回收時(shí)結(jié)束
class MyViewModel: ViewModel() {
init {
viewModelScope.launch {
// Coroutine that will be canceled when the ViewModel is cleared.
}
}
}
val user: LiveData<User> = liveData {
val data = database.loadUser() // loadUser is a suspend function.
emit(data)
}
異步、并發(fā)、并行
異步
- 是一種編程模型
- 獨(dú)立于主程序流事件的發(fā)生
- 異步啟動(dòng)的操作,不會(huì)立即阻塞程序,并同時(shí)發(fā)生
異步是實(shí)現(xiàn)非阻塞和并發(fā)編程的編程模型
并發(fā)
- 獨(dú)立執(zhí)行任務(wù)的組合
- 所有任務(wù)的工作都可以以某種任意順序交錯(cuò)
- 這些任務(wù)不一定必須同時(shí)執(zhí)行
它的主要目標(biāo)是結(jié)構(gòu),而不是并行性
并行
- 同時(shí)執(zhí)行多個(gè)事物
- 與多個(gè)任務(wù)的執(zhí)行有關(guān)
并發(fā)就是一次處理很多事情,并行就是一次做很多事情
協(xié)程中的并發(fā)和并行
- 掛起而非阻塞 ,一個(gè)并發(fā)的例子
import kotlinx.coroutines.*
import kotlin.system.measureTimeMillis
fun main(args: Array<String>) =
runBlocking {
val time = measureTimeMillis {
val one = async { doSomethingUsefulOne() }
val two = async { doSomethingUsefulTwo() }
println("The answer is ${one.await()} ${two.await()}")
}
println("Completed in $time ms")
}
suspend fun doSomethingUsefulTwo() :Int{
delay(1000L)
println("two")
return 2
}
suspend fun doSomethingUsefulOne():Int {
delay(1000L)
println("one")
return 1
}結(jié)果
one
two
The answer is 1 2
Completed in 1020 ms
并行
- GlobalScope
- 指定協(xié)同調(diào)度程序
- 暫停阻塞
suspend fun doSomethingUsefulOne(): BigInteger = withContext(Dispatchers.Default) {
measureTimedValue {
println("in doSomethingUsefulOne")
BigInteger(1500, Random()).nextProbablePrime()
}
}.also {
println("Prime calculation took ${it.duration} ms")
}.value以上就是Kotlin-Coroutines中的async與await異步協(xié)程管理的詳細(xì)內(nèi)容,更多關(guān)于Kotlin Coroutines異步協(xié)程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Kotlin?LinearLayout與RelativeLayout布局使用詳解
- Kotlin FrameLayout與ViewPager2控件實(shí)現(xiàn)滾動(dòng)廣告欄方法
- kotlin協(xié)程之coroutineScope函數(shù)使用詳解
- Kotlin協(xié)程啟動(dòng)createCoroutine及創(chuàng)建startCoroutine原理
- Android結(jié)合kotlin使用coroutine的方法實(shí)例
- Kotlin學(xué)習(xí)教程之協(xié)程Coroutine
- kotlin中泛型中in和out的區(qū)別解析
相關(guān)文章
SpringBoot application.yml 最全避坑與多環(huán)境配置
SpringBoot項(xiàng)目中,application.yml配置至關(guān)重要,涵蓋服務(wù)器端口、數(shù)據(jù)庫連接、第三方服務(wù)集成等配置,正確配置決定項(xiàng)目啟動(dòng)與穩(wěn)定運(yùn)行,本文詳細(xì)解析yml語法、多環(huán)境配置及敏感信息處理,助你高效編寫、規(guī)避常見問題2026-06-06
Java實(shí)現(xiàn)Excel數(shù)據(jù)驗(yàn)證功能
在Java中,開發(fā)者可以使用一些開源的庫(如Apache POI)來添加、修改和處理Excel中的數(shù)據(jù),下面我們就來看看如何使用Java實(shí)現(xiàn)添加,修改和刪除Excel數(shù)據(jù)驗(yàn)證吧2023-10-10
Java 知識(shí)難點(diǎn)之異常的認(rèn)知與使用詳解
所謂異常是指程序在運(yùn)行時(shí)出現(xiàn)錯(cuò)誤時(shí)提示調(diào)用者的機(jī)制,異常的種類有很多,不同種類的異常有不同的含義,也有不同的處理方式,通讀本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下2021-09-09
JavaWeb使用Session和Cookie實(shí)現(xiàn)登錄認(rèn)證
本篇文章主要介紹了JavaWeb使用Session和Cookie實(shí)現(xiàn)登錄認(rèn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
springboot項(xiàng)目idea熱部署的教程詳解
這篇文章主要介紹了springboot項(xiàng)目idea熱部署,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
如何解決SpringBoot啟動(dòng)時(shí)無法加載配置文件或環(huán)境變量問題
文章主要介紹了在Spring Boot項(xiàng)目中遇到配置文件加載失敗和資源目錄圖標(biāo)異常的問題,并提供了詳細(xì)的解決步驟,解決方法包括在pom.xml文件中添加特定配置,確保資源目錄順序正確,以及注意節(jié)點(diǎn)的正確使用,通過這些步驟,可以有效解決資源加載問題,提高開發(fā)效率2024-12-12

