Android協(xié)程高級用法大全
這里系統(tǒng)梳理一下 Android/Kotlin 協(xié)程 的一些高級用法。會從 上下文管理、作用域控制、異常處理、性能優(yōu)化、異步組合 等角度講解,給你落地可用的示例。
1?? 協(xié)程作用域(CoroutineScope)與生命周期綁定
在 Android 中,協(xié)程最好綁定到 生命周期,避免內(nèi)存泄漏。
Activity/Fragment 中
class MainActivity : AppCompatActivity() {
// 生命周期感知協(xié)程作用域
private val scope = lifecycleScope
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
scope.launch {
val data = fetchData()
updateUI(data)
}
}
}- lifecycleScope:綁定 Activity/Fragment 生命周期,自動(dòng)取消
- viewModelScope:綁定 ViewModel 生命周期
手動(dòng)創(chuàng)建 CoroutineScope
private val customScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
- 可以用
SupervisorJob()避免一個(gè)子協(xié)程失敗影響其它子協(xié)程 - 記得在
onDestroy()或onCleared()時(shí)customScope.cancel()
2?? 異步組合:并發(fā)和串行
串行執(zhí)行
val result1 = async { fetchData1() }.await()
val result2 = async { fetchData2() }.await()
val finalResult = combine(result1, result2)- 按順序等待,每個(gè)任務(wù)完成后再執(zhí)行下一個(gè)
并行執(zhí)行
val deferred1 = async { fetchData1() }
val deferred2 = async { fetchData2() }
val result1 = deferred1.await()
val result2 = deferred2.await()- 并行啟動(dòng),節(jié)省等待時(shí)間
并行 + awaitAll
val results = awaitAll(
async { fetchData1() },
async { fetchData2() },
async { fetchData3() }
)3?? 異常處理與結(jié)構(gòu)化并發(fā)
try-catch
scope.launch {
try {
val result = fetchData()
} catch (e: IOException) {
handleError(e)
}
}CoroutineExceptionHandler
val handler = CoroutineExceptionHandler { _, exception ->
Log.e("Coroutine", "Caught $exception")
}
scope.launch(handler) {
val result = fetchData()
}SupervisorJob
- 父協(xié)程失敗不影響子協(xié)程
val supervisor = SupervisorJob() val scope = CoroutineScope(Dispatchers.IO + supervisor)
4?? 切換線程/調(diào)度器
- Dispatchers.Main → UI 操作
- Dispatchers.IO → 網(wǎng)絡(luò)/文件操作
- Dispatchers.Default → CPU 密集型計(jì)算
scope.launch(Dispatchers.IO) {
val data = fetchData()
withContext(Dispatchers.Main) {
updateUI(data)
}
}usewithContext替代launch切換線程
- 便于返回值,避免嵌套
launch
5?? 超時(shí)與取消
超時(shí)
try {
withTimeout(3000L) {
fetchData()
}
} catch (e: TimeoutCancellationException) {
Log.e("Coroutine", "Timeout")
}取消
val job = scope.launch {
fetchData()
}
job.cancel() // 立即取消可取消掛起函數(shù)
- 網(wǎng)絡(luò)、延遲、Channel 等掛起函數(shù)是可取消的
- CPU 密集型循環(huán)需要手動(dòng)檢查
isActive:
for (i in 1..1000) {
if (!isActive) break
doWork()
}6?? Channels 與 Flow(響應(yīng)式數(shù)據(jù)流)
Channel
- 類似隊(duì)列,生產(chǎn)者和消費(fèi)者解耦
val channel = Channel<Int>()
scope.launch {
for (i in 1..5) channel.send(i)
channel.close()
}
scope.launch {
for (i in channel) {
println(i)
}
}Flow
- Kotlin 原生的冷流,支持各種操作符
fun fetchNumbers(): Flow<Int> = flow {
for (i in 1..5) {
delay(100)
emit(i)
}
}
scope.launch {
fetchNumbers()
.map { it * 2 }
.filter { it > 5 }
.collect { println(it) }
}7?? 高級技巧
- 組合多個(gè)異步源
val flow1 = flow { emit(fetchData1()) }
val flow2 = flow { emit(fetchData2()) }
flow1.combine(flow2) { d1, d2 -> d1 + d2 }
.collect { println(it) }- 懶啟動(dòng)的 async
val deferred = async(start = CoroutineStart.LAZY) { fetchData() }
deferred.await() // 真正開始執(zhí)行- 異常隔離
- 使用
SupervisorJob()避免一個(gè)子協(xié)程掛掉影響整個(gè)父協(xié)程
- 使用
到此這篇關(guān)于Android協(xié)程的用法大全的文章就介紹到這了,更多相關(guān)Android協(xié)程用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
實(shí)例解析Android ImageView的scaleType屬性
通過本文給大家介紹ImageView這個(gè)控件的一些使用方法,以及其最重要的一個(gè)屬性: scaleType,對imageview的scaletype相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2016-01-01
Android實(shí)現(xiàn)讀取相機(jī)(相冊)圖片并進(jìn)行剪裁
在 Android應(yīng)用中,很多時(shí)候我們需要實(shí)現(xiàn)上傳圖片,或者直接調(diào)用手機(jī)上的拍照功能拍照處理然后直接顯示并上傳功能,下面將講述調(diào)用相機(jī)拍照處理圖片然后顯示和調(diào)用手機(jī)相冊中的圖片處理然后顯示的功能2015-08-08
Android studio 出現(xiàn) Unsupported major.minor version 52.0解決辦法
這篇文章主要介紹了Android studio 出現(xiàn) Unsupported major.minor version 52.0解決辦法的相關(guān)資料,需要的朋友可以參考下2016-12-12
Android開發(fā)之Parcel機(jī)制實(shí)例分析
這篇文章主要介紹了Android開發(fā)之Parcel機(jī)制,實(shí)例分析了Parcel機(jī)制的原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-05-05
Android編程實(shí)現(xiàn)設(shè)置按鈕背景透明與半透明及圖片背景透明的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)設(shè)置按鈕背景透明與半透明及圖片背景透明的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Button及ImageButton的背景屬性設(shè)置技巧,非常簡單實(shí)用,需要的朋友可以參考下2015-12-12
Flutter快速制作一個(gè)水印組件實(shí)例詳解
這篇文章主要為大家介紹了Flutter快速制作一個(gè)水印組件實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Android 百度地圖marker中圖片不顯示的解決方法(推薦)
下面小編就為大家分享一篇Android 百度地圖marker中圖片不顯示的解決方法(推薦),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01

