国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發(fā) > 綜合 > 正文

一篇文章揭開Kotlin協(xié)程的神秘面紗

2024-07-21 23:03:49
字體:
供稿:網(wǎng)友

前言

Kotlin協(xié)程提供了一種新的異步執(zhí)行方式,但直接查看庫函數(shù)可能會有點混亂,本文中嘗試揭開協(xié)程的神秘面紗。

理論

它是什么

這是別人翻譯: 協(xié)程把異步編程放入庫中來簡化這類操作。程序邏輯在協(xié)程中順序表述,而底層的庫會將其轉(zhuǎn)換為異步操作。庫會將相關(guān)的用戶代碼打包成回調(diào),訂閱相關(guān)事件,調(diào)度其執(zhí)行到不同的線程(甚至不同的機器),而代碼依然想順序執(zhí)行那么簡單。

我的理解:子任務(wù)程協(xié)作運行,優(yōu)雅的處理異步問題解決方案。

它能干什么?

我在做安卓開發(fā),它能替換掉Handler,AsyncTask 甚至是Rxjava來優(yōu)雅的解決異步問題。

Kotlin,協(xié)程

下面讓我們從基礎(chǔ)開始吧,假設(shè)有一個名為launch可以用來啟動協(xié)程

private fun myHeavyFunction() { Log.e("Thread Running ", Thread.currentThread().name)}val job = launch { myHeavyFunction() }

上面的代碼是使用launch一種非常簡單的方法,返回Job一個異步執(zhí)行函數(shù),Job代表一個協(xié)程coroutine作業(yè),可以取消或查詢它的狀態(tài)。

override fun onStop() { if (job.isActive) {  job.cancel() }}

現(xiàn)在,如果查看我們的日志,檢查我們的函數(shù)實際運行的是哪個線程?我們就會得到類似的結(jié)果

E / Thread運行:ForkJoinPool.commonPool-worker-2

我們的代碼是在一個線程中運行的,讓我們稍微了解一下launch本身:  

public fun launch( context:CoroutineContext =DefaultDispatcher, start:CoroutineStart CoroutineStart.DEFAULT, parent:Job?=null, onComp1etion:CompletionHand1er? =null, block:suspend CoroutineScope.()->Unit):Job{ 

再看看DefaultDispatcher的值是什么?

@Suppress("PropertyName ") public actual val DefaultDispatcher: CoroutineDispatcher = CommonPoolobject CommonPool:CoroutineDispatcher()

launch是將CoroutineContext作為第一個參數(shù),這個參數(shù)值默認為代表一個CommonPool線程池類的DefaultDispatcher,這個線程池類根據(jù)當前CPU處理器總數(shù)創(chuàng)建一個帶有Executors的CoroutineContext。完整代碼在這里。

launch是一種協(xié)程構(gòu)建器,可以接受一個協(xié)程分配器CoroutineDispatcher,分配器實際上負責在單獨的線程中運行代碼。

我們可以輕松創(chuàng)建自己的分配器:

val singleThreadDispatcher = newSingleThreadContext("singleThreadDispatcher")

newSingleThreadContext 由Kotlin協(xié)同程序庫本身提供,用于創(chuàng)建僅在單個線程上運行的上下文。我們可以在此基礎(chǔ)上創(chuàng)建自己的函數(shù):

fun <T> singleThreadAsync(block: () -> T): Job = launch(singleThreadDispatcher) { block.invoke() }job = singleThreadAsync { myHeavyFunction() }

下面是運行后的日志

E / Thread運行:singleThreadDispatcher

所以我們用我們自己的線程方案創(chuàng)建了我們自己的簡單協(xié)程:)

讓我們看看我們可以通過Dispatchers做更多事情:

object MyDispatcher : CoroutineDispatcher() { override fun dispatch(context: CoroutineContext, block: Runnable) {  thread {   block.run()  } }}object RxDispatcher : CoroutineDispatcher() { override fun dispatch(context: CoroutineContext, block: Runnable) {  Observable.fromCallable { block.run() }    .subscribeOn(Schedulers.io())    .subscribe {} }}object UIDispatcher : CoroutineDispatcher() { override fun dispatch(context: CoroutineContext, block: Runnable) {  Handler(Looper.getMainLooper()).post {   block.run()  } }}

在這里,我們創(chuàng)建了三個不同的分配器程序并重載了dispatch方法, 我們在每個dispatch方法中以不同的方式執(zhí)行Runnable塊,也就是一個簡單的線程,這個異步線程是使用RxJava實現(xiàn),而Android主線程是使用Handler完成。

如果我們用這些分配器程序執(zhí)行我們的函數(shù),我們會得到這些日志

E / Thread Running:Thread-582 
E / Thread Running:RxCachedThreadScheduler-1 
E / Thread Running:main

這真的顯示了協(xié)同程序的強大功能,因為Coroutines只是語言語法,它們與運行它們的平臺無關(guān)。不同線程的職責分配只需開發(fā)人員使用一組函數(shù)就能實現(xiàn),他可以在Rx線程或主線程上執(zhí)行他喜歡的協(xié)同程序。

協(xié)同程序就像空的冰淇淋甜筒,你可以選擇你想要冰淇淋的填入。

無線程Thread-less異步

編寫異步代碼傳統(tǒng)上被認為是一種線程工作,其實并不總是如此,讓我們看看如何使用Coroutines解決這個問題

讓我們看看一系列函數(shù)執(zhí)行

mySmallFunction1() myHeavyFunction() // Takes 3 seconds to executemySmallFunction2()//Order運行順序E/mySmallFunction1 running on: mainE/myHeavyFunction running on: mainE/mySmallFunction2 running on: main

現(xiàn)在因為myHeavyFunction()函數(shù)需要很長時間才能執(zhí)行,所以我們可能想要異步執(zhí)行它。

mySmallFunction1()thread { myHeavyFunction() } //Execution in a separate thread.mySmallFunction2()//Order順序E/mySmallFunction1 running on: mainE/mySmallFunction2 running on: mainE/myHeavyFunction running on: Thread-697

這里我們將myHeavyFunction()遷移到一個單獨的線程并異步執(zhí)行它,但是如果我們這樣做:

mySmallFunction1()launch(UI) { myHeavyFunction() }mySmallFunction2()//OrderE/mySmallFunction1 running on: mainE/mySmallFunction2 running on: mainE/myHeavyFunction running on: main

這里我們在主線程上運行的Coroutine上下文(UI:由coroutine-android庫提供)中執(zhí)行重量函數(shù),執(zhí)行仍然是異步的,因為Coroutines是通過暫停這部分函數(shù)處理,但函數(shù)執(zhí)行仍然發(fā)生在主線程上,而不創(chuàng)建額外的線程。

實戰(zhàn)協(xié)程

在大多數(shù)情況下,我們需要來自一個異步執(zhí)行的回調(diào),這樣我們就可以通過回調(diào)函數(shù)來更新UI等,這里就可以使用Deferred語法:

Deferred本身繼承擴展了Job,但增加一個額外的功能,它可以在函數(shù)完成執(zhí)行后返回未來的值。

讓我們看看我們在這里做了什么:

fun <T> asyncExecutor(block: () -> T, response: (T) -> Unit): Job { return launch(UI) {  val deferred = async(singleThreadDispatcher) { block.invoke() }  response.invoke(deferred.await()) }}

讓我們分析一下:

1. launch(UI)使用Android的UI所在的線程上下文創(chuàng)建一個協(xié)同Job。

2. 我們通過async異步創(chuàng)建了另一個協(xié)同程序,其中包含我們需要調(diào)用的函數(shù),唯一的區(qū)別是:這個協(xié)程返回一個Deferred值,async是協(xié)程庫的一部分。

3. 我們調(diào)用await()函數(shù)來捕獲Deferred的未來值。這是在UI所在線程上下文中捕獲的。

總而言之,我們創(chuàng)建了一個異步執(zhí)行程序,我們可以在其中傳遞函數(shù)并讓它們異步執(zhí)行,然后將值返回給UI線程。

現(xiàn)在我們在哪里可以使用它 ? 數(shù)據(jù)庫查詢

// Insert into DB without callbacksingleThreadAsync { movieDataBase.movieDao().insert(movieObject) }// Get List of movies from DB and filter itasyncExecutor({ movieDataBase.movieDao().getAll() }, { movieList -> movieList   .filter { it.isFavorite }   .map { it.originalLanguage = "English" } //Dispatch to UI})

我們將插入到DB的請求變成了一個發(fā)射就可以忘記不用等待結(jié)果的異步請求,這是使用singleThreadAsync實現(xiàn)的 。

當我們從DB檢索數(shù)據(jù)時,我們可以使用我們的asyncExecutor來檢索對象列表,然后使用Collection Framework中的運算符發(fā)揮所有kotlin優(yōu)點啦!

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到kotlin教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产一卡2卡3卡免费网站| 日本中文字幕在线2020| 日韩av成人| 快射av在线播放一区| 亚洲精品视频区| gogo高清在线播放免费| 亚洲私人影吧| 黄色三级视频在线观看| 午夜在线小视频| 国产二区在线播放| 亚洲高清在线免费| 久草电影在线| 18加网站在线| 国产精品久久在线| 精品999视频| 欧美人成在线观看网站高清| 国产在线观看a| 国产成人综合美国十次| www.操.com| 国产探花在线观看| 白浆爆出在线观看| 国产在线日本| 69视频在线观看| 国产在线超碰| 亚洲天堂电影在线观看| 国产免费一级片| 伊人精品影院| 国产羞羞视频在线观看| 国产l精品国产亚洲区在线观看| 中文在线官网天堂| 国产九色视频| а√天堂8资源在线官网| 国产三级香港三韩国三级| 欧美高清视频| av片在线观看| 中文在线视频| 国产激情在线| 国产午夜视频| 最新天堂资源在线资源| 九九热在线观看| 不卡av免费观看| av网址在线免费观看| 中文在线视频观看| 国产精品视频二区三区| 国产精品一区二区资源| 天堂中文资源在线| 成在在线免费视频| 黄网址在线永久免费观看| 人xxxx性xxxxx欧美| 天天草天天干| 久热中文字幕| 黄色av电影在线播放| 成年黄网站在线观看免费| 欧美专区日韩| 国产麻豆一级片| 国产馆av播放| 在线视频中文字幕| 午夜影院免费| www.操操| 国产女人伦码一区二区三区不卡| www网站在线观看| 日本在线观看| 国产精选在线观看| 国产福利在线视频| 亚洲社区在线| 开心丁香婷婷深爱五月| 国产尤物视频在线| 最近中文字幕mv2018在线高清| 国产一级在线观看| 国产二级c片l毛片| 日韩亚洲一区中文字幕| 精品中文字幕不卡在线视频| 中文字幕免费中文| 国产特黄在线| 91在线视频免费看| 日本成人a视频| 国产私人尤物无码不卡| 国产福利电影在线观看| 欧美xxxx黑人又粗又长| 国产精品蜜臀| 午夜在线不卡| 国产黄色一级电影| 国产在线观看网站| av黄色在线观看| 天堂在线一二区| 午夜亚洲成人| 国产9色视频| 国产永久免费高清在线观看视频 | 精品三级久久久久久久电影聊斋 | 国产黄视频网站| www.夜夜操.com| 国产精品视频一区二区免费不卡 | 国产丝袜护土调教在线视频| 2020亚洲男人天堂| 国产在线观看a| 俺来俺也去www色在线观看| 狠狠狠狠狠狠操| 免费a在线看| 在线免费看av| 国产网站av| 国产呻吟对白刺激无套视频在线| 免费高清av| 午夜小视频在线| 日本综合一区二区三区| 精品国产二区三区| 二区中文字幕| 黄色片视频在线观看| 久久国产精品久久久久久小说| 99久久免费精品国产免费| 国产福利电影在线观看| 国产福利av网站| 丁香婷婷在线观看| 国产麻豆精品视频一区二区| 丁香视频五月| 国产午夜视频| 国产成人亚洲欧美电影| 精品极品三级久久久久| 精灵使的剑舞无删减版在线观看| 国产精品毛片一区二区三区四区| 国产丝袜视频在线播放| 国产高清在线a视频大全| 精品久久九九| 先锋av资源网| 国产美女视频一区二区三区| 丁香综合五月| 91www在线观看| 99热99re6国产在线播放| gogogo影视剧免费观看在线观看| 午夜在线观看91| 日本中文字幕在线观看| 国产福利一区二区在线精品| 午夜影院在线免费观看| 天天操天天曰| 精品美女在线观看视频在线观看 | 国产一级片在线| 精品国产免费第一区二区| 美女网站在线观看| 国产变态拳头交视频一区二区 | 五月综合网站| av超碰在线| 国产一级免费在线观看| 亚洲xxxxxx| 国产偷倩在线播放| 日本成人免费网站| 国产经典av| 九九热在线播放| 91欧洲在线视精品在亚洲| а√天堂www在线а√天堂视频| 国产无套粉嫩白浆在线2022年| 亚洲成av人影片在线观看| 午夜视频99| 四虎成人欧美精品在永久在线| 国产亚洲依依| 懂色一区二区三区| eeuss影院网站免费观看| 2019天天操夜夜操| 国产素人视频在线观看| 成人欧美日韩| 激情网站在线| 日本不卡1区2区3区| av免费在线播放| 91美女主播在线视频| 中文字幕在线观看av| 国产在线精品一区二区不卡| av在线中文| 亚洲欧洲成人| 伊人222成人综合网| 国产超碰在线观看| 99在线免费观看| 亚洲综合在线不卡| gogo在线观看| 欧美视频免费一区二区三区| 欧美亚洲另类在线观看| 欧美黑人乱大交| 九九久久久2| 99视频免费| 国产黄色在线观看| 精品国产白色丝袜高跟鞋| 亚洲伊人网在线观看| 成年黄网站在线观看免费| 亚洲精品视频区| 欧美日韩在线视频免费观看| 青草av在线| 中文字幕亚洲精品视频| 国产午夜三区视频在线| 精精国产xxxx视频在线动漫| 亚洲午夜久久久久中文字幕| 女子免费在线观看视频www| 免费不卡中文字幕视频| 五月婷婷导航| 精品精品导航| 国产在线一二三区| 国产jizz| 黄色毛片在线观看| 国产一卡2卡3卡免费网站| 国产区av在线| 97在线免费| 成人精品一区二区三区免费| 国产精品第八页| 黄色av网站在线|