-
當前位置:首頁 > 創(chuàng)意學院 > 技術(shù) > 專題列表 > 正文
kotlin協(xié)成(kotlin協(xié)程和線程的區(qū)別)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于kotlin協(xié)成的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準,寫出的就越詳細,有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、kotlin之協(xié)程(七),協(xié)程中relay、yield 區(qū)別
kotlin之協(xié)程(一),線程,進程,協(xié)程,協(xié)程可以替換線程嗎?
kotlin之協(xié)程(二),Kotlin協(xié)程是什么、掛起是什么、掛起的非阻塞式
kotlin之協(xié)程(三),開始創(chuàng)建協(xié)程,launch,withContext
kotlin之協(xié)程(四),協(xié)程的核心關(guān)鍵字suspend
kotlin之協(xié)程(五),launch 函數(shù)以及協(xié)程的取消與超時
kotlin之協(xié)程(六),協(xié)程中的 async和launch的區(qū)別以及runBlocking
kotlin之協(xié)程(七),協(xié)程中relay、yield 區(qū)別
relay 和 yield 方法是協(xié)程內(nèi)部的操作,可以掛起協(xié)程,
我們只要使用 kotlin 提供的協(xié)程上下文類型,線程池是有多個線程的,再次執(zhí)行的機會很快就會有的。
除了 main 類型,協(xié)程在掛起后都會封裝成任務(wù)放到協(xié)程默認線程池的任務(wù)隊列里去,有延遲時間的在時間過后會放到隊列里去,沒有延遲時間的直接放到隊列里去
二、Kotlin-協(xié)程網(wǎng)絡(luò)請求封裝
真正的數(shù)據(jù)請求放在Repository(官方的方案還會有一層)
BaseResult可能是失敗,也可能是成功,所以要對這兩種情況做區(qū)分。這里轉(zhuǎn)換規(guī)則是把BaseResult<T> 轉(zhuǎn)換成ApiResult,ApiResult是密封類,只有兩個子類一個是Success,一個是Error。
比如出現(xiàn)鏈接超時等非接口問題,kotlin中需要用異常捕獲來處理。
可以將接口返回的data數(shù)據(jù)重新組裝成想要的類,比如data+請求的參數(shù)。
viewmodel 調(diào)用
checkResult 主要對封裝的數(shù)據(jù)判斷,并通知UI更新。
三、Android Kotlin Coroutine(3):Job概述
在 Kotlin 中啟動一個協(xié)程主要有 2 種方式:
一種是通過 launch 啟動,一種是通過 async 啟動,前者會返回一個 Job 類型的對象,后者會返回一個 Deferred 類型的對象。
Job 顧名思義就是“工作”的意思,每個協(xié)程可以想象成是一個工作任務(wù),啟動一個協(xié)程就是啟動一個工作任務(wù),來看看 Job 接口的主要定義:
從前面 Job 的接口定義中可以看到,它與線程 Thread 真的很相似,同樣都有好幾種不同的運行狀態(tài),下面通過幾個簡單的例子直觀的感受一下:
執(zhí)行結(jié)果為:
懶加載模式,協(xié)程還沒啟動,所以 isActive = false
執(zhí)行結(jié)果為:
協(xié)程正常啟動,所以isActive = true
執(zhí)行結(jié)果為:
協(xié)程還沒執(zhí)行完畢,就被取消運行,所以 isCancelled = true
執(zhí)行結(jié)果為:
協(xié)程已經(jīng)執(zhí)行完畢了,其 isCompleted 肯定為 true 了,再去調(diào)用 cancel() 方法,就沒有任何影響了,所以 isCancelled = false。一件已經(jīng)完成的任務(wù),你再去取消它,是沒有任何實際意義的了。
執(zhí)行結(jié)果為:
協(xié)程還沒有啟動就取消,發(fā)現(xiàn) isCompleted 與 isCancelled 都為 true,與前面幾種情況對比一下,才能真正理解這幾種狀態(tài)的變化。
執(zhí)行結(jié)果為:
協(xié)程非正常結(jié)束運行,相當于系統(tǒng)把它取消掉了,所以其 isCancelled 也為 true 。
在源碼里可以看到以下狀態(tài)圖:
首先它也是一個 Job,所以它擁有 Job 的一切特性。其次,它能返回一個結(jié)果值,這點與 Java 里的 Future 類特別相似(如果你熟悉的話)。它比 Job 多了一個方法:
調(diào)用該方法時,它會等待該 Job 執(zhí)行完并返回一個結(jié)果值。這是一個 suspend 方法,只能在協(xié)程內(nèi)部調(diào)用,它會暫停協(xié)程的執(zhí)行(當然它并不會阻塞線程),當 Job 執(zhí)行完返回結(jié)果后,它又會恢復協(xié)程的執(zhí)行。
一般在這種情況下,你可能會用到它:
從 Job 的接口定義中可以看到,Job 是可以有很多子 Job 的,如果一個 Job 與其他 Job 沒有任何關(guān)聯(lián),那么它的完成及取消就很簡單,不會影響到其他 Job 的執(zhí)行。如果是有父子關(guān)系的 Job,那么他們的完成及取消則是會有相互關(guān)聯(lián)關(guān)系的。
執(zhí)行結(jié)果為:
執(zhí)行結(jié)果為:
parentJob 被取消之后,childJob2 最后也被取消掉了。
四、kotlin協(xié)程的生命周期與jetpack組件綁定
安卓上, 協(xié)程可以幫忙解決兩大問題:
管理長時間運行的任務(wù), 這些任務(wù)可能阻塞主線程, 導致 UI 卡頓.
在主線程上安全地調(diào)用網(wǎng)絡(luò)或磁盤操作.
安卓上使用協(xié)程的最好方式是使用官方的架構(gòu)組件, 它們提供了對協(xié)程的支持. 目前 ViewModel, Lifecycle, LiveData , Room 組件提供了對協(xié)程一等的支持.
1、 ViewModel ViewModelScope
對 ViewModel 的支持主要是在 ViewModel 上提供了一個稱為 ViewModelScope 的 CoroutineScope , 所有在 ViewModelScope 上啟動的協(xié)程, 當 ViewModelScope 銷毀時自動取消. 這樣可以有效防止忘記取消任務(wù)時導致的資源泄漏.
其實 viewModelScope 的實現(xiàn)非常簡單, 就是一個帶有 Dispatchers.Main 的 SupervisorJob, 當 ViewModel.clear() 時, 在里面調(diào)用 Job.cancel() , 因為結(jié)構(gòu)化并發(fā)的原因, 所有在 viewModelScope 范圍內(nèi)啟動的協(xié)程, 都會級聯(lián)取消.
2、Lifecycle LifecycleScope
每個具有生命周期的對象(Lifecycle)都有一個 LifecycleScope , 所有在它的范圍內(nèi)啟動的協(xié)程, 當生命周期對象銷毀時, 都會取消. 生命周期對象的 CoroutineScope 可以通過 lifecycle.coroutineScope 或者 lifecycleOwner.lifecycleScope 屬性獲取.
3、掛起生命周期相關(guān)的協(xié)程
在 Activity 或者 Fragment 中, 我們有時需要等到某個生命周期方法時, 或者至少在某個生命周期方法之后才執(zhí)行某一任務(wù), 如頁面狀態(tài)至少要 STARTED 才可以執(zhí)行 FragmentTransaction , 對這種需求, 生命周期組件也提供了支持. Lifecycle 提供了 lifecycle.whenCreated, lifecycle.whenStarted, lifecycle.whenResumed 三個方法, 運行在這些方法內(nèi)的協(xié)程, 如果頁面的狀態(tài)不是至少處于要求的最小狀態(tài), 協(xié)程將會掛起運行.
如果協(xié)程通過上面的whenXXX方法啟動后, 處于活動狀態(tài), 還沒有結(jié)束, 這時頁面銷毀了, 則協(xié)程會自動取消, 并且會走到下面的 finally 塊中, 所在 finally 中, 需要檢查頁面所處的狀態(tài), 再決定做什么動作.
這里要注意: 如果頁面 restart 重啟了, 但協(xié)程并不會重啟, 總之要確保信息是正確的.
4、LiveData 中使用協(xié)程
5、Room 對協(xié)程的支持
Room 從 v2.1 開始支持協(xié)程
JetPack知識點實戰(zhàn)系列三:使用 Coroutines, Retrofit, Moshi實現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)請求
以上就是關(guān)于kotlin協(xié)成相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
杭州百度公司KO優(yōu)屏網(wǎng)絡(luò)(杭州seo公司 優(yōu)屏網(wǎng)絡(luò))
常州旅游景觀設(shè)計施工公司(常州旅游景觀設(shè)計施工公司排名)