HOME 首頁(yè)
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營(yíng)
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    kotlin協(xié)成(kotlin協(xié)程和線程的區(qū)別)

    發(fā)布時(shí)間:2023-04-13 16:54:16     稿源: 創(chuàng)意嶺    閱讀: 142        

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于kotlin協(xié)成的問題,以下是小編對(duì)此問題的歸納整理,讓我們一起來看看吧。

    開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等

    只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端

    官網(wǎng):https://ai.de1919.com。

    創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解相關(guān)業(yè)務(wù)請(qǐng)撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    kotlin協(xié)成(kotlin協(xié)程和線程的區(qū)別)

    一、kotlin之協(xié)程(七),協(xié)程中relay、yield 區(qū)別

    kotlin之協(xié)程(一),線程,進(jìn)程,協(xié)程,協(xié)程可以替換線程嗎?

    kotlin之協(xié)程(二),Kotlin協(xié)程是什么、掛起是什么、掛起的非阻塞式

    kotlin之協(xié)程(三),開始創(chuàng)建協(xié)程,launch,withContext

    kotlin之協(xié)程(四),協(xié)程的核心關(guān)鍵字suspend

    kotlin之協(xié)程(五),launch 函數(shù)以及協(xié)程的取消與超時(shí)

    kotlin之協(xié)程(六),協(xié)程中的 async和launch的區(qū)別以及runBlocking

    kotlin之協(xié)程(七),協(xié)程中relay、yield 區(qū)別

    relay 和 yield 方法是協(xié)程內(nèi)部的操作,可以掛起協(xié)程,

    我們只要使用 kotlin 提供的協(xié)程上下文類型,線程池是有多個(gè)線程的,再次執(zhí)行的機(jī)會(huì)很快就會(huì)有的。

    除了 main 類型,協(xié)程在掛起后都會(huì)封裝成任務(wù)放到協(xié)程默認(rèn)線程池的任務(wù)隊(duì)列里去,有延遲時(shí)間的在時(shí)間過后會(huì)放到隊(duì)列里去,沒有延遲時(shí)間的直接放到隊(duì)列里去

    二、Kotlin-協(xié)程網(wǎng)絡(luò)請(qǐng)求封裝

    真正的數(shù)據(jù)請(qǐng)求放在Repository(官方的方案還會(huì)有一層)

    BaseResult可能是失敗,也可能是成功,所以要對(duì)這兩種情況做區(qū)分。這里轉(zhuǎn)換規(guī)則是把BaseResult<T> 轉(zhuǎn)換成ApiResult,ApiResult是密封類,只有兩個(gè)子類一個(gè)是Success,一個(gè)是Error。

    比如出現(xiàn)鏈接超時(shí)等非接口問題,kotlin中需要用異常捕獲來處理。

    可以將接口返回的data數(shù)據(jù)重新組裝成想要的類,比如data+請(qǐng)求的參數(shù)。

    viewmodel 調(diào)用

    checkResult 主要對(duì)封裝的數(shù)據(jù)判斷,并通知UI更新。

    三、Android Kotlin Coroutine(3):Job概述

    在 Kotlin 中啟動(dòng)一個(gè)協(xié)程主要有 2 種方式:

    一種是通過 launch 啟動(dòng),一種是通過 async 啟動(dòng),前者會(huì)返回一個(gè) Job 類型的對(duì)象,后者會(huì)返回一個(gè) Deferred 類型的對(duì)象。

    Job 顧名思義就是“工作”的意思,每個(gè)協(xié)程可以想象成是一個(gè)工作任務(wù),啟動(dòng)一個(gè)協(xié)程就是啟動(dòng)一個(gè)工作任務(wù),來看看 Job 接口的主要定義:

    從前面 Job 的接口定義中可以看到,它與線程 Thread 真的很相似,同樣都有好幾種不同的運(yùn)行狀態(tài),下面通過幾個(gè)簡(jiǎn)單的例子直觀的感受一下:

    執(zhí)行結(jié)果為:

    懶加載模式,協(xié)程還沒啟動(dòng),所以 isActive = false

    執(zhí)行結(jié)果為:

    協(xié)程正常啟動(dòng),所以isActive = true

    執(zhí)行結(jié)果為:

    協(xié)程還沒執(zhí)行完畢,就被取消運(yùn)行,所以 isCancelled = true

    執(zhí)行結(jié)果為:

    協(xié)程已經(jīng)執(zhí)行完畢了,其 isCompleted 肯定為 true 了,再去調(diào)用 cancel() 方法,就沒有任何影響了,所以 isCancelled = false。一件已經(jīng)完成的任務(wù),你再去取消它,是沒有任何實(shí)際意義的了。

    執(zhí)行結(jié)果為:

    協(xié)程還沒有啟動(dòng)就取消,發(fā)現(xiàn) isCompleted 與 isCancelled 都為 true,與前面幾種情況對(duì)比一下,才能真正理解這幾種狀態(tài)的變化。

    執(zhí)行結(jié)果為:

    協(xié)程非正常結(jié)束運(yùn)行,相當(dāng)于系統(tǒng)把它取消掉了,所以其 isCancelled 也為 true 。

    在源碼里可以看到以下狀態(tài)圖:

    首先它也是一個(gè) Job,所以它擁有 Job 的一切特性。其次,它能返回一個(gè)結(jié)果值,這點(diǎn)與 Java 里的 Future 類特別相似(如果你熟悉的話)。它比 Job 多了一個(gè)方法:

    調(diào)用該方法時(shí),它會(huì)等待該 Job 執(zhí)行完并返回一個(gè)結(jié)果值。這是一個(gè) suspend 方法,只能在協(xié)程內(nèi)部調(diào)用,它會(huì)暫停協(xié)程的執(zhí)行(當(dāng)然它并不會(huì)阻塞線程),當(dāng) Job 執(zhí)行完返回結(jié)果后,它又會(huì)恢復(fù)協(xié)程的執(zhí)行。

    一般在這種情況下,你可能會(huì)用到它:

    從 Job 的接口定義中可以看到,Job 是可以有很多子 Job 的,如果一個(gè) Job 與其他 Job 沒有任何關(guān)聯(lián),那么它的完成及取消就很簡(jiǎn)單,不會(huì)影響到其他 Job 的執(zhí)行。如果是有父子關(guān)系的 Job,那么他們的完成及取消則是會(huì)有相互關(guān)聯(lián)關(guān)系的。

    執(zhí)行結(jié)果為:

    執(zhí)行結(jié)果為:

    parentJob 被取消之后,childJob2 最后也被取消掉了。

    四、kotlin協(xié)程的生命周期與jetpack組件綁定

    安卓上, 協(xié)程可以幫忙解決兩大問題:

    管理長(zhǎng)時(shí)間運(yùn)行的任務(wù), 這些任務(wù)可能阻塞主線程, 導(dǎo)致 UI 卡頓.

    在主線程上安全地調(diào)用網(wǎng)絡(luò)或磁盤操作.

    安卓上使用協(xié)程的最好方式是使用官方的架構(gòu)組件, 它們提供了對(duì)協(xié)程的支持. 目前 ViewModel, Lifecycle, LiveData , Room 組件提供了對(duì)協(xié)程一等的支持.

    1、 ViewModel ViewModelScope

    對(duì) ViewModel 的支持主要是在 ViewModel 上提供了一個(gè)稱為 ViewModelScope 的 CoroutineScope , 所有在 ViewModelScope 上啟動(dòng)的協(xié)程, 當(dāng) ViewModelScope 銷毀時(shí)自動(dòng)取消. 這樣可以有效防止忘記取消任務(wù)時(shí)導(dǎo)致的資源泄漏.

    其實(shí) viewModelScope 的實(shí)現(xiàn)非常簡(jiǎn)單, 就是一個(gè)帶有 Dispatchers.Main 的 SupervisorJob, 當(dāng) ViewModel.clear() 時(shí), 在里面調(diào)用 Job.cancel() , 因?yàn)榻Y(jié)構(gòu)化并發(fā)的原因, 所有在 viewModelScope 范圍內(nèi)啟動(dòng)的協(xié)程, 都會(huì)級(jí)聯(lián)取消.

    2、Lifecycle LifecycleScope

    每個(gè)具有生命周期的對(duì)象(Lifecycle)都有一個(gè) LifecycleScope , 所有在它的范圍內(nèi)啟動(dòng)的協(xié)程, 當(dāng)生命周期對(duì)象銷毀時(shí), 都會(huì)取消. 生命周期對(duì)象的 CoroutineScope 可以通過 lifecycle.coroutineScope 或者 lifecycleOwner.lifecycleScope 屬性獲取.

    3、掛起生命周期相關(guān)的協(xié)程

    在 Activity 或者 Fragment 中, 我們有時(shí)需要等到某個(gè)生命周期方法時(shí), 或者至少在某個(gè)生命周期方法之后才執(zhí)行某一任務(wù), 如頁(yè)面狀態(tài)至少要 STARTED 才可以執(zhí)行 FragmentTransaction , 對(duì)這種需求, 生命周期組件也提供了支持. Lifecycle 提供了 lifecycle.whenCreated, lifecycle.whenStarted, lifecycle.whenResumed 三個(gè)方法, 運(yùn)行在這些方法內(nèi)的協(xié)程, 如果頁(yè)面的狀態(tài)不是至少處于要求的最小狀態(tài), 協(xié)程將會(huì)掛起運(yùn)行.

    如果協(xié)程通過上面的whenXXX方法啟動(dòng)后, 處于活動(dòng)狀態(tài), 還沒有結(jié)束, 這時(shí)頁(yè)面銷毀了, 則協(xié)程會(huì)自動(dòng)取消, 并且會(huì)走到下面的 finally 塊中, 所在 finally 中, 需要檢查頁(yè)面所處的狀態(tài), 再?zèng)Q定做什么動(dòng)作.

    這里要注意: 如果頁(yè)面 restart 重啟了, 但協(xié)程并不會(huì)重啟, 總之要確保信息是正確的.

    4、LiveData 中使用協(xié)程

    5、Room 對(duì)協(xié)程的支持

    Room 從 v2.1 開始支持協(xié)程

    JetPack知識(shí)點(diǎn)實(shí)戰(zhàn)系列三:使用 Coroutines, Retrofit, Moshi實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求

    以上就是關(guān)于kotlin協(xié)成相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。


    推薦閱讀:

    小紅書kol怎么找產(chǎn)品(小紅書怎么找客源)

    杭州百度公司KO優(yōu)屏網(wǎng)絡(luò)(杭州seo公司 優(yōu)屏網(wǎng)絡(luò))

    微博kol聯(lián)系傳播易(微博的傳播)

    為什么自己櫥窗自己不能下單

    常州旅游景觀設(shè)計(jì)施工公司(常州旅游景觀設(shè)計(jì)施工公司排名)