徐州营销型网站建设,龙华网站建设网站设计公司,河北保定建设集团招聘信息网站,semseo文章目录 官网地址1 来源2 出现原因3 特点1#xff09; 轻量2#xff09;内存泄漏更少3#xff09;内置取消支持4#xff09;Jetpack 集成 4 依赖项信息5 在后台线程中执行6 使用协程确保主线程安全7 处理异常 官网地址
https://developer.android.google.cn/kotlin/corou… 文章目录 官网地址1 来源2 出现原因3 特点1 轻量2内存泄漏更少3内置取消支持4Jetpack 集成 4 依赖项信息5 在后台线程中执行6 使用协程确保主线程安全7 处理异常 官网地址
https://developer.android.google.cn/kotlin/coroutines?hlzh-cn
1 来源
协程是一种并发设计模式您可以在 Android 平台上使用它来简化异步执行的代码。协程是在版本 1.3 中添加到 Kotlin 的它基于来自其他语言的既定概念。2 出现原因
在 Android 上协程有助于管理长时间运行的任务如果管理不当这些任务可能会阻塞主线程并导致应用无响应。使用协程的专业开发者中有超过 50% 的人反映使用协程提高了工作效率。3 特点
1 轻量 您可以在单个线程上运行多个协程因为协程支持挂起不会使正在运行协程的线程阻塞。挂起比阻塞节省内存且支持多个并行操作2内存泄漏更少
使用结构化并发机制在一个作用域内执行多项操作3内置取消支持
取消功能会自动通过正在运行的协程层次结构传播4Jetpack 集成
许多 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 threadviewModelScope.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.SuccessLoginResponse - // Happy pathelse - // Show error in UI}}}
}