Kotlin协程使用

一、开启协程的方式

1、顶层开启协程的函数

基本使用:

// 方法一,使用 runBlocking 顶层函数
runBlocking {
    getImage(imageId)
}
​
// 方法二,使用 GlobalScope 单例对象
//            👇 可以直接调用 launch 开启协程,或者aysnc需要await接收结果
GlobalScope.launch {
    getImage(imageId)
}
​
// 方法三,自行通过 CoroutineContext 创建一个 CoroutineScope 对象
//                                    👇 需要一个类型为 CoroutineContext 的参数
val coroutineScope = CoroutineScope(context)
coroutineScope.launch { //或者async,需要await接收结果
    getImage(imageId)
}
  • 方法一通常适用于单元测试的场景,而业务开发中不会用到这种方法,因为它是线程阻塞的。

  • 方法二和使用 runBlocking 的区别在于不会阻塞线程。但在 Android 开发中同样不推荐这种用法,因为它的生命周期会和 app 一致,且不能取消。

  • 方法三是比较推荐的使用方法,我们可以通过 context 参数去管理和控制协程的生命周期(这里的 context 和 Android 里的不是一个东西,是一个更通用的概念,会有一个 Android 平台的封装来配合使用)

以上三个方法的共同特点就是,在非协程的代码中开启协程的方法。

2、切协程方法/操作符

操作符/函数 描述
withContext 这个函数可以在指定的上下文中执行协程代码。例如,可以使用Dispatchers.IO来在IO线程中执行协程。
launch 用于启动一个新的协程。它会返回一个Job对象,可以用来取消协程
async launch类似,但它会返回一个Deferred对象,可以通过调用await()方法获取协程的结果

注意:launch 和 async 是必须在 协程里面开启 才能编译过去,在协程之外开启,编译会报错;withContext则必须在协程或者suspend修饰的方法中使用,否则编译报错。

launch和withContext的区别

在Kotlin协程中,launchwithContext是两个用于启动协程的函数,它们之间存在一些差异。具体分析如下:

  • launchlaunch函数用于在协程作用域内创建一个新的协程。它不阻塞当前线程,而是将协程任务放入后台执行。launch通常用于执行不需要返回值的任务,例如在后台执行一些操作而不需要等待结果。launch函数的特点是它会将协程任务挂起,直到任务完成或者被取消。

  • withContextwithContext函数用于在特定的上下文中执行协程代码块。它可以确保代码块在指定的协程作用域内执行,并且可以使用指定的协程调度器或Job。withContext通常用于需要切换协程作用域或调度器的场景,例如在IO密集型任务中使用Dispatchers.IO调度器。

import kotlinx.coroutines.*
​
fun main() = runBlocking {
    val job = launch {
        // 在这里执行协程代码
    }
    // 等待协程执行完成
    job.join()
}
​
fun main() = runBlocking {
    val deferred = async {
        // 在这里执行协程代码并返回结果
    }
    // 获取协程的结果
    val result = deferred.await()
    println("Result: $result")
}
​
fun main() = runBlocking {
    withContext(Dispatchers.IO) {
        // 在这里执行协程代码
    }
}
​
 fun test2(){
     val job = GlobalScope.launch {
         // 在这里执行协程代码
         print(t1()+t2())
     }
     Thread.sleep(3000)
     print("After runBlocking ${job.isActive} ")
 }
suspend fun t1() =  withContext(Dispatchers.IO){
    delay(1000L) // 模拟耗时操作
    "After delay 1 "
}
suspend fun t2() = withContext(Dispatchers.IO){
    delay(2000L) // 模拟耗时操作
    "After delay 2"
}
​

二、Android中开启协程

在Android Activity中开启协程,通常需要结合CoroutineScope和生命周期感知组件(如lifecycleScope)来确保协程的生命周期与Activity的生命周期自动绑定

1、使用lifecycleScope:

lifecycleScope是一个与Activity或Fragment的生命周期绑定的特殊CoroutineScope。当UI组件被销毁时,所有在这个范围内启动的协程都会自动取消,防止内存泄漏。

Kotlin 协程Kotlin 提供的一套简化异步编程的轻量级线程操作框架,适合 Android 开发中的异步任务处理,以下是关于它的使用指南: ### 核心组件使用 - **CoroutineScope**:这是一个与生命周期绑定的作用域,比如 `viewModelScope`。它可以确保协程在特定的生命周期内执行,避免内存泄漏。示例代码如下: ```kotlin import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.launch class MyViewModel : ViewModel() { fun performTask() { viewModelScope.launch { // 协程内执行的任务 } } } ``` - **Dispatcher**:调度器,可指定协程在哪个线程或线程池执行,有 `IO`、`Default`、`Main`、`Unconfined` 等类型。例如,进行网络请求时可使用 `IO` 调度器: ```kotlin import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking fun main() = runBlocking { launch(Dispatchers.IO) { // 执行 IO 密集型任务,如网络请求 } } ``` - **Job**:用于控制协程任务的生命周期。可以启动、取消协程等操作。示例如下: ```kotlin import kotlinx.coroutines.* fun main() = runBlocking { val job = launch { // 协程任务 } // 取消协程 job.cancel() } ``` - **挂起函数**:用 `suspend` 标记的可暂停函数。它只能在协程或其他挂起函数中调用。例如: ```kotlin import kotlinx.coroutines.* suspend fun doSuspendWork() { delay(1000) // 模拟耗时操作 println("Suspend work done") } fun main() = runBlocking { launch { doSuspendWork() } } ``` ### 基础使用场景 - **网络请求封装**:使用协程可以方便地进行网络请求,并且可以在协程中处理请求结果。示例代码如下: ```kotlin import kotlinx.coroutines.* import retrofit2.Retrofit import retrofit2.http.GET // 定义 API 接口 interface ApiService { @GET("data") suspend fun getData(): String } fun main() = runBlocking { val retrofit = Retrofit.Builder() .baseUrl("https://example.com/") .build() val api = retrofit.create(ApiService::class.java) launch { try { val result = api.getData() println("Received data: $result") } catch (e: Exception) { println("Error: ${e.message}") } } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值