最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android協(xié)程高級用法大全

 更新時(shí)間:2025年08月19日 11:30:58   作者:AD鈣奶-lalala  
這篇文章給大家介紹Android協(xié)程高級用法大全,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友跟隨小編一起學(xué)習(xí)吧

這里系統(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)文章

最新評論

宣武区| 托里县| 自治县| 彝良县| 当涂县| 巴彦县| 满洲里市| 阳城县| 衡东县| 成武县| 嘉定区| 石景山区| 巨鹿县| 海门市| 米脂县| 涟水县| 南康市| 利辛县| 西华县| 铁岭县| 武宁县| 永仁县| 龙口市| 巴林左旗| 庐江县| 治县。| 沭阳县| 姚安县| 阳谷县| 始兴县| 安远县| 青海省| 曲沃县| 团风县| 新乐市| 雷山县| 庄河市| 上饶县| 湾仔区| 新丰县| 镇雄县|