kotlinx.coroutines
Channel Flow Actor Job 调度器 作用域
Kotlin 标准库
协程上下文 拦截器 挂起函数
dependencies {
// Kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.32"
// 协程核心库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3"
// 协程Android支持库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3"
// 协程Java8支持库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.4.3"
// lifecycle对于协程的扩展封装
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
}
在Android中新建一个线程,大约需要消耗1M的内存,如果使用线程池,线程间数据的同步是一个非长复杂的事情,所以就有了协程:
可以看作是轻量级线程,创建一个协程的成本很低
可以轻松的挂起和恢复操作
支持阻塞线程的协程和不阻塞线程的协程
可以更好的实现异步和并发
简单的理解就是,可以极大程度的简化异步操作,可以顺序地表达程序,协程也提供了一种避免阻塞线程并用更廉价、更可控的操作替代线程阻塞的方法 – 协程挂起。
如果一个请求的参数另一个请求的结果作为参数通常做法是使用rxjava的flatmap
但是协程更方便操作如下:
挂起函数的作用是当程序有值过来就执行,没有值过来就等待
suspend fun requestToken(): Token { ... } // 挂起函数
suspend fun createPost(token: Token, item: Item): Post { ... } // 挂起函数
fun processPost(post: Post) { ... }
fun postItem(item: Item) {
GlobalScope.launch {
val token = requestToken()
val post = createPost(token, item)
processPost(post)
// 需要异常处理,直接加上 try/catch 语句即可
}
}
下一节详细探讨协程具体函数的用法
网友评论