Android Kotlin 協程全面指南

協程是 Kotlin 提供的一套簡化異步編程的輕量級線程操作框架,特別適合 Android 開發中的異步任務處理。以下是 Android 開發中需要掌握的協程核心知識點:

1. 協程基礎概念

1.1 協程是什么

  • 輕量級線程:比線程更高效,可以在單個線程中運行多個協程

  • 可掛起恢復:可以在不阻塞線程的情況下掛起和恢復執行

  • 結構化并發:提供更好的生命周期管理和錯誤處理機制

1.2 基本組件

// 啟動協程的三種方式
launch { /* 啟動不返回結果的協程 */ }
async { /* 啟動可返回結果的協程 */ }
runBlocking { /* 阻塞當前線程直到協程完成 */ }

2. 協程構建器

2.1 基本構建器

// 在ViewModel中啟動協程
viewModelScope.launch {// 協程體
}// 在Activity/Fragment中啟動協程
lifecycleScope.launch {// 自動跟隨生命周期取消
}// 全局協程
GlobalScope.launch { // 不推薦在Android中使用,容易內存泄漏
}

2.2 帶返回值的構建器

val deferred = viewModelScope.async {delay(1000)"Result"
}// 獲取結果
val result = deferred.await()

3. 協程上下文與調度器

3.1 常用調度器

Dispatchers.Main    // 主線程,更新UI
Dispatchers.IO      // IO操作
Dispatchers.Default // CPU密集型計算
Dispatchers.Unconfined // 不指定線程(不推薦)

3.2 上下文組合

viewModelScope.launch(Dispatchers.IO + CoroutineName("MyCoroutine")) {println("Running in ${Thread.currentThread().name}")
}

4. 協程取消與異常處理

4.1 取消協程

val job = viewModelScope.launch {repeat(1000) { i ->ensureActive() // 檢查是否被取消delay(500)println("Job: I'm sleeping $i ...")}
}// 取消協程
job.cancel()

4.2 異常處理

viewModelScope.launch {try {val result = withContext(Dispatchers.IO) {fetchData() // 可能拋出異常}} catch (e: Exception) {// 處理異常}
}// 使用SupervisorJob防止異常傳播
val scope = CoroutineScope(SupervisorJob())

5. 協程與Android架構組件

5.1 ViewModel集成

class MyViewModel : ViewModel() {fun fetchData() {viewModelScope.launch {try {val data = repository.getData()_uiState.value = UiState.Success(data)} catch (e: Exception) {_uiState.value = UiState.Error(e.message)}}}
}

5.2 Lifecycle集成

class MyActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)lifecycleScope.launch {repeatOnLifecycle(Lifecycle.State.STARTED) {// 只在STARTED狀態收集流viewModel.uiState.collect { state ->updateUI(state)}}}}
}

6. 協程與網絡請求

6.1 Retrofit集成

interface ApiService {@GET("users/{id}")suspend fun getUser(@Path("id") userId: String): User
}// 使用
viewModelScope.launch {try {val user = apiService.getUser("123")_user.value = user} catch (e: Exception) {_error.value = e.message}
}

6.2 并行請求

viewModelScope.launch {val userDeferred = async { apiService.getUser(userId) }val postsDeferred = async { apiService.getPosts(userId) }val user = userDeferred.await()val posts = postsDeferred.await()_result.value = UserWithPosts(user, posts)
}

7. 協程與Room數據庫

7.1 DAO定義

@Dao
interface UserDao {@Insertsuspend fun insert(user: User)@Query("SELECT * FROM users")fun getAllUsers(): Flow<List<User>>
}

7.2 使用示例

viewModelScope.launch {// 插入數據userDao.insert(User(name = "John"))// 觀察數據變化userDao.getAllUsers().collect { users ->_users.value = users}
}

8. 協程與Flow

8.1 創建Flow

fun countDownFlow(): Flow<Int> = flow {val countDownFrom = 10for (i in countDownFrom downTo 0) {delay(1000)emit(i)}
}

8.2 收集Flow

viewModelScope.launch {countDownFlow().collect { time ->_countDown.value = time}
}

8.3 Flow操作符

viewModelScope.launch {(1..5).asFlow().filter { it % 2 == 0 }.map { it * it }.collect { println(it) } // 輸出 4, 16
}

9. 協程最佳實踐

  1. 避免GlobalScope:使用viewModelScope或lifecycleScope

  2. 主線程安全:使用withContext切換調度器

  3. 取消傳播:確保協程可以正確取消

  4. 異常處理:為重要操作添加try-catch

  5. 避免阻塞:使用delay而非Thread.sleep

  6. 測試:使用TestCoroutineDispatcher進行單元測試

10. 協程測試

@ExperimentalCoroutinesApi
class MyViewModelTest {@get:Ruleval coroutineRule = MainCoroutineRule()@Testfun `test data loading`() = runTest {val viewModel = MyViewModel(FakeRepository())viewModel.loadData()advanceUntilIdle() // 等待所有協程完成assertEquals(expectedData, viewModel.uiState.value)}
}@ExperimentalCoroutinesApi
class MainCoroutineRule : TestWatcher() {val testDispatcher = StandardTestDispatcher()override fun starting(description: Description) {Dispatchers.setMain(testDispatcher)}override fun finished(description: Description) {Dispatchers.resetMain()}
}

總結

Kotlin協程為Android異步編程提供了強大的解決方案,通過掌握這些核心知識點,您可以:

  • 簡化異步代碼

  • 避免回調地獄

  • 更好地管理資源

  • 編寫更易測試的代碼

  • 實現響應式UI更新

在實際開發中,建議結合ViewModel、LiveData/Flow和Retrofit等組件使用協程,構建更健壯的Android應用架構。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92752.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92752.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92752.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux】進程切換與優先級

前言&#xff1a; 上文我們講到了操作系統與Linux中進程的狀態【Linux】進程狀態-CSDN博客 本文我們來講進程的優先級、以及進程的切換 進程優先級 什么是優先級&#xff1f; CPU中資源是有限的&#xff0c;而進程的數量一定是遠大于CPU資源的&#xff0c;所以優先級是進程得…

首發即開源!DAWorkBench數據可視化分析軟件正式發布!(附源碼下載網址)

1 系統介紹DAWorkBench是一款面向科研實驗和工程測試場景的數據可視化分析開源軟件&#xff0c;支持實現數據清洗、信號處理和交互式可視化等功能。系統集成文件IO、數據處理以及可視化交互三大模塊&#xff0c;支持多維數據分析與高質量圖表生成&#xff0c;助力用戶高效完成從…

Android Studio歷史版本快速下載(二次修改記錄)

原版&#xff1a;Android Studio歷史版本快速下載_android studio 歷史版本下載-CSDN博客 一. 最新版本 https://developer.android.com/studio?hlzh-cn 二. 歷史版本 中國官網的歷史版本為何不能下載&#xff1f;&#xff08;https://developer.android.com/studio/archi…

The Missing Semester of Your CS Education 學習筆記以及一些拓展知識(六)

文章目錄The Missing Semester of Your CS Education 學習筆記以及一些拓展知識版本控制Git筆記部分Git的基本工作原理Git 的核心工作原理&#xff1a;快照而非差異Git 的三大工作區域Git的核心對象Git的四個對象對象之間的關系與工作流程&#xff1a;對象的引用Git的安裝和基礎…

嵌入式與 Linux 系統中的核心圖形庫全解析

嵌入式與 Linux 系統中的核心圖形庫全解析 圖形庫在嵌入式系統與 Linux 桌面系統中扮演著重要角色。從最底層的 GPU 驅動接口&#xff0c;到上層的圖形渲染與 GUI 工具包&#xff0c;共同構成了完整的圖形顯示棧。本文將系統整理圖形相關的核心組件&#xff0c;按功能分層分類&…

深度學習模塊實踐手冊(第十二期)

56、Ghost 模塊論文《GhostNet: More Features from Cheap Operations》1、作用&#xff1a; Ghost 模塊是一種輕量級的特征提取模塊&#xff0c;旨在通過廉價操作生成更多特征圖&#xff0c;減少計算量的同時保持模型性能。傳統卷積神經網絡在生成特征圖時存在大量冗余計算&am…

自己動手造輪子:如何創建JAR并通過Maven在Spring Boot中引用

讓代碼復用變得簡單優雅——3分鐘學會封裝專屬工具庫作為Java開發者&#xff0c;你是否遇到過這些痛點&#xff1f;多個項目重復編寫相同工具類工具代碼分散難以統一維護團隊協作缺乏標準化工具庫本文將手把手教你創建自己的JAR包&#xff0c;并優雅地集成到Spring Boot項目中&…

使用dea工具 給vue 里面的ts打斷點

在 Vue 項目中使用 TypeScript 時&#xff0c;我們通常會在 IDE&#xff08;如 JetBrains 的 IntelliJ IDEA 或 WebStorm&#xff09;中設置斷點進行調試。以下是詳細步驟&#xff1a; 準備工作 確保項目已配置 source maps&#xff08;Vue CLI 創建的項目默認已配置&#xff0…

Zabbix 企業級分布式監控

目錄 簡介 一、監控系統基礎 1.1 監控的價值 1.2 監控的 5 大類型與 5 大層次 1.3 監控系統的實現原理 二、Zabbix&#xff1a;企業級監控方案 2.1 Zabbix 簡介 2.2 Zabbix 核心功能特性 2.3 Zabbix 角色與架構 三、Zabbix 部署案例 3.1 資源清單 3.2 基礎環境配置…

SQL JOIN 全解析:用 `users` 與 `orders` 表徹底掌握內連接、左連接、右連接

SQL JOIN 全解析&#xff1a;用 users 與 orders 表徹底掌握內連接、左連接、右連接 在日常開發中&#xff0c;SQL 的連接&#xff08;JOIN&#xff09;語句是數據庫查詢的核心技能。尤其在多表聯合查詢時&#xff0c;不掌握好 INNER JOIN、LEFT JOIN、RIGHT JOIN&#xff0c;…

(一)從零搭建unity3d機械臂仿真-unity3d導入urdf模型

1.新建工程并加載模型 &#xff08;1&#xff09;unity中新建3d工程 &#xff08;2&#xff09;將機器人模型導入到unity3d中 導入開源Unity-Robotics-Hub的機械臂。 詳細操作參考視頻 ROS Unity URDF Import Testing Robot Motion 使用 URDF Importer工具 在 Unity 中&#x…

Linux之網絡部分-應用層自定義協議與序列化

一、應用層 1.1、理解協議 協議是一種 "約定". socket api 的接口, 在讀寫數據時, 都是按 "字符串" 的方式來發送接收的。如果我們要傳輸一些 "結構化的數據" 怎么辦呢? 其實&#xff0c;協議就是雙方約定好的結構化的數據。 1.2、網絡版計…

機器學習week3-分類、正則化

1. 邏輯回歸1.1. 線性回歸 vs 邏輯回歸對比維度線性回歸邏輯回歸任務類型回歸&#xff08;預測連續值&#xff09;分類&#xff08;預測離散類別&#xff09;輸出范圍(?∞,∞)[0,1]&#xff08;概率值&#xff09;損失函數均方誤差&#xff08;MSE&#xff09;對數損失&#x…

FastAdmin 中生成插件

在 FastAdmin 中生成一個 OCR 發票識別插件&#xff0c;可以按照以下步驟進行開發。這里假設你已經熟悉 FastAdmin 插件開發的基本流程&#xff0c;并會使用 Composer 和 PHP 擴展。1. 創建插件骨架使用 FastAdmin 命令行工具生成插件基礎結構&#xff1a;php think addon -a o…

DevExpress WinForms中文教程:Grouping(分組)- 如何自定義分組算法?

DevExpress WinForms擁有180組件和UI庫&#xff0c;能為Windows Forms平臺創建具有影響力的業務解決方案。DevExpress WinForms能完美構建流暢、美觀且易于使用的應用程序&#xff0c;無論是Office風格的界面&#xff0c;還是分析處理大批量的業務數據&#xff0c;它都能輕松勝…

PHP 與 Vue.js 結合的前后端分離架構

PHP 與 Vue.js 結合是構建現代 Web 應用的流行技術棧&#xff0c;通常采用 前后端分離架構。以下是關鍵要點和推薦實現方案&#xff1a; 一、技術棧組合 角色技術選項后端 (PHP)Laravel (推薦)、Symfony、CodeIgniter前端 (Vue)Vue 2/3、Vue Router、Pinia/Vuex、Vite通信協議…

XML高效處理類 - 專為Office文檔XML處理優化

/**** 提供XML讀取、寫入、修改、查詢等高級功能&#xff0c;支持命名空間和復雜XML結構* * 主要功能&#xff1a;* 1. 復雜路徑解析&#xff08;支持屬性篩選、索引、通配符&#xff09;* 2. 完整節點類型支持&#xff08;元素、文本、CDATA、注釋、PI&#xff09;* 3. 高效元…

星慈光編程蟲2號小車講解第一篇--向前向后

星慈光編程蟲2號小車是一款基于微控制器&#xff08;如Arduino&#xff09;的編程教學小車&#xff0c;常用于學習機器人控制和編程基礎。本講解將重點介紹小車的基本運動&#xff1a;前進、后退、左轉和右轉。這些運動通過控制電機實現&#xff0c;通常涉及調整電機的方向和速…

iOS 加固工具有哪些?快速發布團隊的實戰方案

在當今快速迭代的 iOS 開發環境中&#xff0c;團隊需要在高頻上線與應用安全之間找到平衡。快速發布不應犧牲安全性&#xff0c;而安全加固也不應成為阻礙上線的瓶頸。這就要求開發者在加固工具的選型與流程設計上&#xff0c;做到既高效又可靠。 那么&#xff0c;iOS 加固工具…

結構型模式-架構解耦與擴展實踐

結構型模式聚焦于對象間的組合關系&#xff0c;通過優化類與對象的裝配方式&#xff0c;實現系統的靈活性與可擴展性。在分布式系統中&#xff0c;由于多節點協作、跨網絡通信及異構環境集成等特性&#xff0c;傳統結構型模式需進行適應性改造&#xff0c;以應對分布式特有的復…