Android Kotlin 协程

本文介绍了Kotlin中的协程概念,包括其作用类似线程框架,展示了如何在GlobalScope中使用和调度协程,以及Dispatchers和suspend关键字的重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、协程是什么?

携程就是Kotlin的线程框架,类似于Thread、executors、Handler等等。

二、使用

在{}代码块就是携程,调用

        GlobalScope.launch(Dispatchers.Main) {	
            var s=suspendSetTitle("123")	//协程
        }
        suspend fun suspendSetTitle(title: String): String {
        	withContext(Dispatchers.IO) {
           		setTitle(title)
        	}
        	return "0000"
   		}

三、关键字介绍

GlobalScope:是协程的启用类,调用launch并设定协程在什么线程中启动。
Dispatchers:该字段声明代码块最终会在什么线程中运行。
suspend:告诉调用者,该关键字修饰的方法可能含有耗时的操作,需要在携程中调用,并在该代码块中使用withContext方法。
withContext:该方法包裹的代码块运行前会挂起协程,将withContext代码块中耗时操作优先执行完后继续在main线程中运行,这时才会返回“0000”.

### 如何在 Android 开发中使用 Kotlin 协程 Kotlin 1.1 引入了协程,这是一种编写异步、非阻塞代码的新方法[^1]。在 Android 开发中,Kotlin 协程可以显著简化异步任务的处理逻辑,例如网络请求、数据库操作等。 #### 1. 添加依赖 为了在 Android 项目中使用 Kotlin 协程,需要添加 `kotlinx-coroutines` 库的依赖。可以在 `build.gradle` 文件中添加以下内容: ```gradle dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4" } ``` 确保版本号与项目兼容,并同步 Gradle。 #### 2. 基本概念 - **Coroutine Scope**: 协程的作用域,用于管理协程的生命周期。 - **Dispatchers**: 决定协程在哪个线程上运行。常见的调度器包括 `Dispatchers.Main`(主线程)、`Dispatchers.IO`(I/O 操作)和 `Dispatchers.Default`(计算密集型任务)。 - **Suspend Functions**: 可挂起函数,允许协程在等待异步操作完成时暂停而不阻塞线程。 #### 3. 示例代码 以下是一个简单的示例,展示如何在 Android 中使用协程执行异步任务: ```kotlin import kotlinx.coroutines.* fun main() = runBlocking { // 启动主协程 launch(Dispatchers.IO) { // 在 IO 线程中启动新协程 delay(1000L) // 模拟耗时操作 println("World! + ${Thread.currentThread().name}") // 输出结果 } println("Hello, + ${Thread.currentThread().name}") // 主协程继续执行 delay(2000L) // 延迟以保持 JVM 运行 } ``` 在 Android 中,可以将 `runBlocking` 替换为 `lifecycleScope` 或 `viewModelScope`,以便更好地与生命周期绑定[^3]。 #### 4. 使用 `lifecycleScope` 和 `viewModelScope` - **lifecycleScope**: 绑定到 Activity 或 Fragment 的生命周期,适用于短生命周期任务。 - **viewModelScope**: 绑定到 ViewModel 的生命周期,适用于长生命周期任务。 示例代码如下: ```kotlin class MyViewModel : ViewModel() { fun fetchData() { viewModelScope.launch(Dispatchers.IO) { val result = performNetworkCall() // 执行网络请求 withContext(Dispatchers.Main) { // 切换回主线程更新 UI updateUI(result) } } } private suspend fun performNetworkCall(): String { delay(2000L) // 模拟网络延迟 return "Data from network" } private fun updateUI(data: String) { // 更新 UI } } ``` #### 5. 错误处理 协程中的错误可以通过 `try-catch` 块捕获,或者使用 `CoroutineExceptionHandler` 处理全局异常。 ```kotlin val handler = CoroutineExceptionHandler { _, exception -> println("Caught exception: $exception") } GlobalScope.launch(Dispatchers.Default + handler) { throw RuntimeException("Something went wrong!") } ``` #### 6. 取消协程 通过调用 `Job.cancel()` 方法可以取消协程。例如: ```kotlin val job = GlobalScope.launch { repeat(1000) { i -> println("job: I'm sleeping $i ...") delay(500L) } } delay(1300L) // 延迟一段时间后取消 job.cancel() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值