Kotlin协程简介

文章目录

    • 官网地址
    • 1 来源
    • 2 出现原因
    • 3 特点
        • 1) 轻量
        • 2)内存泄漏更少
        • 3)内置取消支持
        • 4)Jetpack 集成
    • 4 依赖项信息
    • 5 在后台线程中执行
      • 6 使用协程确保主线程安全
      • 7 处理异常

官网地址

https://developer.android.google.cn/kotlin/coroutines?hl=zh-cn

1 来源

协程是一种并发设计模式,您可以在 Android 平台上使用它来简化异步执行的代码。协程是在版本 1.3 中添加到 Kotlin 的,它基于来自其他语言的既定概念。

2 出现原因

在 Android 上,协程有助于管理长时间运行的任务,如果管理不当,这些任务可能会阻塞主线程并导致应用无响应。使用协程的专业开发者中有超过 50% 的人反映使用协程提高了工作效率。

3 特点

1) 轻量
 您可以在单个线程上运行多个协程,因为协程支持挂起,不会使正在运行协程的线程阻塞。挂起比阻塞节省内存,且支持多个并行操作
2)内存泄漏更少
使用结构化并发机制在一个作用域内执行多项操作
3)内置取消支持
取消功能会自动通过正在运行的协程层次结构传播
4)Jetpack 集成
许多 Jetpack 库都包含提供全面协程支持的扩展。某些库还提供自己的协程作用域,可供您用于结构化并发

4 依赖项信息

dependencies { 
	implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9")
}

5 在后台线程中执行

网络请求发出时阻塞界面线程。如需将执行操作移出主线程,最简单的方法是创建一个新的协程,然后在 I/O 线程上执行网络请求
class LoginViewModel(
    private val loginRepository: LoginRepository
): ViewModel() {

    fun login(username: String, token: String) {
        // Create a new coroutine to move the execution off the UI thread
        viewModelScope.launch(Dispatchers.IO) {
            val jsonBody = "{ username: \"$username\", token: \"$token\"}"
            loginRepository.makeLoginRequest(jsonBody)
        }
    }
}

6 使用协程确保主线程安全

使用协程库中的 withContext() 函数将协程的执行操作移至其他线程

由于 makeLoginRequest 将执行操作移出主线程,login 函数中的协程现在可以在主线程中执行

login 函数现在按以下方式执行

  • 应用从主线程上的 View 层调用 login() 函数
  • launch 在主线程上创建新协程,然后协程开始执行
  • 在协程内,调用 loginRepository.makeLoginRequest() 现在会挂起协程的进一步执行操作,直至 makeLoginRequest() 中的 withContext 块结束运行
  • withContext 块结束运行后,login() 中的协程在主线程上恢复执行操作,并返回网络请求的结果

7 处理异常

为了处理 Repository 层可能抛出的异常,请使用 Kotlin 对异常的内置支持。在以下示例中,我们使用的是 try-catch 块

class LoginViewModel(
    private val loginRepository: LoginRepository
): ViewModel() {

    fun makeLoginRequest(username: String, token: String) {
        viewModelScope.launch {
            val jsonBody = "{ username: \"$username\", token: \"$token\"}"
            val result = try {
                loginRepository.makeLoginRequest(jsonBody)
            } catch(e: Exception) {
                Result.Error(Exception("Network request failed"))
            }
            when (result) {
                is Result.Success<LoginResponse> -> // Happy path
                else -> // Show error in UI
            }
        }
    }
}

你可能感兴趣的:(Kotlin,kotlin,开发语言,android,协程,协程简介)