Kotlin協程 和 協程 是兩個東東,這裏只說Kotlin協程;
Kotlin協程是一個線程框架;
需要額外引入:
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0"
直接上代碼,簡單實現:
// 默認在後臺執行,可指定線程
GlobalScope.launch {
LogUtil.i("zz------${Thread.currentThread().name}")
}
// zz------DefaultDispatcher-worker-2 (後臺線程)
線程切換,掛起函數走一波:
suspend掛起函數
// 設置主線程線程環境
GlobalScope.launch(Dispatchers.Main) {
// suspend,掛起函數,方法內切線程
ioFun1()
// 自動回到協程主線程,上面指定主線程
uiFun1()
}
/*
zz------ioFun1--DefaultDispatcher-worker-3
zz------uiFun1--main
*/
/*
suspend 修飾的方法稱之爲掛起函數,有標記和提醒作用
掛起函數只能在協程或者另外一個掛起函數中使用,在協程中掛起函數結束後自動切回“協程主線程”
*/
private suspend fun ioFun1() {
// 切換線程
withContext(Dispatchers.IO) {
LogUtil.i("zz------ioFun1--${Thread.currentThread().name}")
}
}
private fun uiFun1() {
LogUtil.i("zz------uiFun1--${Thread.currentThread().name}")
}
如果協程執行耗時操作未完成,頁面關閉如何操作?
val launch = GlobalScope.launch {
// 耗時任務
getData()
}
// 取消協程
launch.cancel()
如果有多個協程如何操作?
KTX(Kotlin Extensions)擴展:引入KTX
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
可在mvvm中使用:
// 在onDestroy方法中自動取消,不用手動取消
lifecycleScope.launch {
// 耗時任務
delay(1000)
}
持續更新中。。。