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

Kotlin 協(xié)程 supervisorScope {} 運行崩潰解決方法

 更新時間:2024年01月10日 10:17:25   作者:韓老九  
看過很多?supervisorScope {}?文檔的使用,我照抄一摸一樣的代碼,運行就崩潰,最后找到了解決方法,應(yīng)該是kotlin版本更新做過改動,當前我使用的是?androidx.core:core-ktx:1.9.0,本文給大家介紹Kotlin 協(xié)程 supervisorScope {} 運行崩潰解決方法,感興趣的朋友一起看看吧

Kotlin 協(xié)程 supervisorScope {} 運行崩潰解決

前言

簡單介紹supervisorScope函數(shù),它用于創(chuàng)建一個使用了 SupervisorJob 的 coroutineScope,
該作用域的特點:拋出的異常,不會 連鎖取消 同級協(xié)程和父協(xié)程。

看過很多 supervisorScope {} 文檔的使用,我照抄一摸一樣的代碼,運行就崩潰,最后找到了解決方法,應(yīng)該是kotlin版本更新做過改動,當前我使用的是 androidx.core:core-ktx:1.9.0

解決方法

需要將CoroutineExceptionHandler,作為參數(shù),才有效果,不然會崩潰。

    private fun test() {
        // 原來的寫法,現(xiàn)在會崩潰
//        runBlocking {
//            Log.d("TAG", "Start")
//            launch {
//                delay(100)
//                Log.d("TAG", "Task from runBlocking")
//            }
//            supervisorScope {
//                val firstChild = launch {
//                    Log.d("TAG", "First Child")
//                    throw AssertionError("First child is cancelled")
//                }
//                val secondChild = launch {
//                    Log.d("TAG", "Second Child")
//                }
//                Log.d("TAG", "Cancelling supervisor")
//            }
//            Log.d("TAG", "End")
//        }
        // 最新的寫法
        runBlocking {
            Log.d("TAG", "Start")
            launch {
                delay(100)
                Log.d("TAG", "Task from runBlocking")
            }
            supervisorScope {
                // 需要將CoroutineExceptionHandler,作為參數(shù),才有效果,不然會崩潰
                val firstChild = launch(CoroutineExceptionHandler { _, _ -> }) {
                    Log.d("TAG", "First Child")
                    throw AssertionError("First child is cancelled")
                }
                val secondChild = launch {
                    Log.d("TAG", "Second Child")
                }
                Log.d("TAG", "Cancelling supervisor")
            }
            Log.d("TAG", "End")
        }
    }

補充:

kotlin 協(xié)程異常處理

import kotlinx.coroutines.*
import java.net.URL
suspend fun fetchResponse(code: Int, delay: Int) = coroutineScope {
    val deferred: Deferred<String?> = async {
            URL("http://httpstat.us/$code?sleep=$delay").readText()
        }
    try {
        val response = deferred.await()
        println(response)
    } catch(ex: CancellationException) {
        println("${ex.message} for fetchResponse $code")
    }
}
runBlocking {
    val handler = CoroutineExceptionHandler {_, ex ->
        println("exception handled: ${ex.message}")
    }
    val job = launch(Dispatchers.IO + SupervisorJob() + handler) {
        // 協(xié)程1
        launch{fetchResponse(202, 1000)} // 協(xié)程2
        launch{fetchResponse(404, 2000)} // 協(xié)程3
        launch{fetchResponse(200, 3000)} // 協(xié)程4
    }
    job.join()
}

如上的運行結(jié)果如下所示

202 Accepted
Parent job is Cancelling for fetchResponse 200
exception handled: http://httpstat.us/404?sleep=2000

分析:

一、fetchResponse使用的是coroutineScope來包起來,那么如果有協(xié)程的異常則該函數(shù)不會自己處理會向上傳播;如果不想讓協(xié)程的異常向外傳播則可以使用supervisorScope

二、fetchResponse內(nèi)部函數(shù)使用的是async/await, 并且try/catch沒有將async包起來,那么如果async發(fā)生了異常會發(fā)生什么事情呢?

1、async作為 根協(xié)程(CoroutineScope或者 supervisorScope的直接子協(xié)程),異常不會自動拋出;它會在你調(diào)用await的時候才拋出所以這里的try/catch只是將await包起來即可

2、那么既然await的異常已經(jīng)被捕獲了,為何404還會向上拋出異常導(dǎo)致其他協(xié)程的取消呢?這是因為當async發(fā)生異常的時候會立即把異常拋出給父節(jié)點,因為父節(jié)點是coroutineScope所以繼續(xù)向上拋出直到協(xié)程1,然后協(xié)程1將所有的子協(xié)程取消

那么問題來了:1中說的async不會拋出異常,2中又說會立即拋出異常;那么是否是自相矛盾呢?

async拋出的異常try/catch是沒法捕獲的,它會向父協(xié)程傳播異常(即父子協(xié)程之間的異常傳播,而不是代碼級別的異常傳播所以try/catch捕獲不到;曾經(jīng)使用catch(ex: Exception) 嘗試捕獲確實沒有捕獲成功)

綜上所述,async跟await都是有拋出異常,只是他們拋出的方式不一樣,async是父子協(xié)程之間的異常傳播而await是代碼邏輯的異常傳播可被try/catch捕獲到

那么問題來了:async不能被try/catch捕獲到,該怎樣捕獲呢?

這里的launch使用了CoroutineExceptionHandler進行捕獲;當異常傳到協(xié)程1的時候,繼續(xù)向上傳播;因為協(xié)程1的父協(xié)程是SupervisorJob(為何協(xié)程1的父協(xié)程是SupervisorJob可以見http://m.fzitv.net/program/2975787fp.htm)所以需要協(xié)程1自己處理;因為協(xié)程1的launch中包含了handler的異常捕獲則會使用該異常類進行處理

這里launch可以使用CoroutineExceptionHandler進行捕獲,那么async可以使用CoroutineExceptionHandler進行捕獲么? 答案是不可以的,async對應(yīng)的await需要使用try/catch進行捕獲

注意:coroutineScope構(gòu)建器中拋出的異常,或由協(xié)程創(chuàng)建的協(xié)程中拋出的異常,不會被 try/catch捕獲!

具體的可參考:http://m.fzitv.net/article/264218.htm

FQ版(英文版):https://medium.com/androiddevelopers/exceptions-in-coroutines-ce8da1ec060c

到此這篇關(guān)于Kotlin 協(xié)程 supervisorScope {} 運行崩潰解決的文章就介紹到這了,更多相關(guān)Kotlin 協(xié)程 supervisorScope {} 運行崩潰內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • android 實現(xiàn)在照片上繪制涂鴉的方法

    android 實現(xiàn)在照片上繪制涂鴉的方法

    今天小編就為大家分享一篇android 實現(xiàn)在照片上繪制涂鴉的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Android Studio無法改變Button背景顏色解決辦法

    Android Studio無法改變Button背景顏色解決辦法

    今天我來和大家探討一個在Android開發(fā)中常見但可能讓初學(xué)者感到困惑的問題,如何在Android Studio中改變Button的背景顏色,這個問題看似簡單,但實際操作中可能會遇到一些意想不到的挑戰(zhàn),接下來,我將從多個角度為大家提供解決方案,需要的朋友可以參考下
    2024-05-05
  • Android系統(tǒng)音量條實例代碼

    Android系統(tǒng)音量條實例代碼

    這篇文章主要介紹了Android系統(tǒng)音量條實例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Android自定義View繪制貝塞爾曲線實現(xiàn)流程

    Android自定義View繪制貝塞爾曲線實現(xiàn)流程

    貝塞爾曲線的本質(zhì)是通過數(shù)學(xué)計算的公式來繪制平滑的曲線,分為一階,二階,三階及多階。但是這里不講數(shù)學(xué)公式和驗證,那些偉大的數(shù)學(xué)家已經(jīng)證明過了,所以就只講講Android開發(fā)中的運用吧
    2022-11-11
  • Android屏蔽軟鍵盤并且顯示光標的實例詳解

    Android屏蔽軟鍵盤并且顯示光標的實例詳解

    這篇文章主要介紹了Android屏蔽軟鍵盤并且顯示光標的實例詳解的相關(guān)資料,希望通過本文能幫助到大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • Android 使用騰訊X5瀏覽器上傳圖片的示例

    Android 使用騰訊X5瀏覽器上傳圖片的示例

    這篇文章主要介紹了Android 使用騰訊X5瀏覽器上傳圖片的示例,幫助大家更好的理解和學(xué)習使用Android開發(fā),感興趣的朋友可以了解下
    2021-04-04
  • Android錄音功能的實現(xiàn)以及踩坑實戰(zhàn)記錄

    Android錄音功能的實現(xiàn)以及踩坑實戰(zhàn)記錄

    在Android 開發(fā)過程中,有些功能是通用的,或者是多個業(yè)務(wù)方都需要使用的,下面這篇文章主要給大家介紹了關(guān)于Android錄音功能的實現(xiàn)以及踩坑的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Android 隱藏底部虛擬鍵的兩種方法

    Android 隱藏底部虛擬鍵的兩種方法

    本文通過實例代碼給大家講解了Android 隱藏底部虛擬鍵的兩種方法,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-07-07
  • Android加載對話框同時異步執(zhí)行實現(xiàn)方法

    Android加載對話框同時異步執(zhí)行實現(xiàn)方法

    Android中通過子線程連接網(wǎng)絡(luò)獲取資料,同時顯示加載進度對話框給用戶的操作
    2012-11-11
  • Android ListView隱藏右側(cè)滾動條功能

    Android ListView隱藏右側(cè)滾動條功能

    這篇文章主要介紹了Android ListView隱藏右側(cè)滾動條功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-03-03

最新評論

湘潭市| 钦州市| 衡水市| 长治县| 滕州市| 永平县| 桓台县| 安阳市| 千阳县| 和政县| 台北县| 炉霍县| 康定县| 灵宝市| 吉安县| 台湾省| 宁乡县| 大安市| 齐齐哈尔市| 临朐县| 赞皇县| 金川县| 安陆市| 肃北| 全州县| 肥城市| 阿鲁科尔沁旗| 清原| 榕江县| 扎兰屯市| 卢湾区| 陆丰市| 油尖旺区| 石棉县| 安国市| 鹿邑县| 南涧| 蓝山县| 麟游县| 克什克腾旗| 泾川县|