最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Coroutine 學(xué)習(xí)(二)ViewModelScope LifeCycleScope Dispatcher

2021-09-29 11:18 作者:房頂上的鋁皮水塔  | 我要投稿

問題:

  1. koin如何創(chuàng)建ViewModel?

  2. ViewModelScope和LifeCycleScope的最佳使用方式是什么?

  3. ViewModel和Repository使用方式是什么 各自的職責(zé)是什么?

  4. Room和ViewModel應(yīng)該如何配合使用

  5. 單獨(dú)使用supsend函數(shù),suspend函數(shù)表示的協(xié)程和它所在的CoroutineScope的生命周期相同嗎?

  6. 我們所使用的Dispatchers.Main IO 是一個【單例】嗎?

Koin

首先需要明確module, Service, scope這些概念和我們之前所了解的都不同,在談及Koin的上下文時,這些都是Koin定義的概念

Koin使用步驟

Koin是一種實(shí)現(xiàn)依賴注入的方式,使用的時候需要遵循的步驟

  1. 定義KoinModule

????2. 在application中注冊:

Service的創(chuàng)建:

factory single viewModel都可以創(chuàng)建Service到Module中


生命周期

Service的創(chuàng)建方式還指定了Service的生命周期??梢宰远xScope的生命周期

依賴注入方式:

1. get

定義在module中的類需要參數(shù),可以通過get聲明參數(shù)。Koin會在module中尋找是否存在對應(yīng)的Service

在其他地方也可以通過get方法獲取實(shí)例:

2. 懶加載inject


在Android中使用協(xié)程的最佳做法:

https://developer.android.google.cn/kotlin/coroutines/coroutines-best-practices?hl=zh-cn

在Android ViewModel中使用協(xié)程的最佳方式

在ViewModel中使用協(xié)程的一個方式是使用viewModelScope,因?yàn)樽裱?strong>結(jié)構(gòu)化并發(fā)思想。

結(jié)構(gòu)化并發(fā):

內(nèi)容:使得每一個協(xié)程都運(yùn)行在指定的CoroutineScope中

為什么要這么做:

  1. 是我們的每一個suspend、協(xié)程都不會產(chǎn)生lost or leak

  2. 保證所有的異常都能夠正確的處理

對于lost和leak的理解:

因?yàn)樗械膮f(xié)程的生命都在一個上下文中,所以只要管理好上文的Scope,內(nèi)部的協(xié)程也可以被管理,當(dāng)關(guān)閉父協(xié)程(外面的scope)時,內(nèi)部的子協(xié)程也會被關(guān)閉。

ViewModel的生命周期


ViewModel的生命周期和創(chuàng)建它時傳入的LifeCycle組件的生命周期有關(guān)。使用viewScope我們能在viewScope中開啟協(xié)程也不用擔(dān)心內(nèi)存泄漏:


viewModelScope = SupervisorJob + Dispatchers.Main.immediate

當(dāng)ViewModel生命周期走到盡頭時,會調(diào)用clear方法其中又會調(diào)用closeWithRuntimeException。因?yàn)関iewModelScope又是一個CloseCoroutineScope,所以可以使用closeWithRuntimeException方法關(guān)閉。Dispatchers.Main.immediate判斷如果當(dāng)前在主線程,立馬執(zhí)行協(xié)程,不會通過Dispatcher再分發(fā)。

對于ViewModel職責(zé)的理解

ViewModel應(yīng)該是連接View和Model的橋梁。所以viewModelscope是在Main調(diào)度器上運(yùn)行。

如果在ViewModelScope中出現(xiàn)了異常,應(yīng)該選擇就地捕獲異常

src:https://developer.android.google.cn/kotlin/coroutines/coroutines-best-practices?hl=zh-cn


在協(xié)程中使用viewModelScope的方式?

https://medium.com/androiddevelopers/easy-coroutines-in-android-viewmodelscope-25bffb605471

Dipatcher:

協(xié)程中的Dispatchers.main Dispatchers.IO Dispatchers.default 這些會創(chuàng)建單例,還是每次調(diào)用都創(chuàng)建不同的實(shí)例?

Dispatchers.Main:

以上是Dispacthers.Main的構(gòu)建過程。Dispatcher.Main在文檔中的描述的特點(diǎn)是:該協(xié)程調(diào)度器被限定在了主線程中,可以和UI對象進(jìn)行交互。


MainDispatcherLoader

MainDispatcherLoader類是一個object,也就是說這個類是一個天生的單例。MainDispatcherLoader通過loadMainDispatcher創(chuàng)建了dispatcher。

接下來調(diào)用了MainDispatcherFactory的方法創(chuàng)建Dispacther

。MainDispatcherFactory的實(shí)現(xiàn)類只有AndroidDispatcherFactory一個。在AndroidDispatcherFatctory的重寫方法中,我們發(fā)現(xiàn)真正的返回對象是HandlerContext:


HandlerContext其中一個參數(shù)就是通過主線程的Looper構(gòu)建的Handler實(shí)例。所以其實(shí)現(xiàn)在已經(jīng)可以得出結(jié)論,每次調(diào)用Dispatchers.Main都會創(chuàng)建一個新的HandlerContext對象。我們通過這個Handler對象和主線程進(jìn)行交互。特別是可以看看這里的dispatch方法:

其他的Dispatcher也是類似的,所以我們可以在Koin Module中使用factory模塊生成Dispatcher的Service。


總結(jié):

  1. 理解協(xié)程首先需要理解什么叫做結(jié)構(gòu)性并發(fā)。結(jié)構(gòu)性并發(fā)保證了所有的協(xié)程、掛起函數(shù)都能被CoroutineScope管理生命周期。

  2. 創(chuàng)建一個協(xié)程會繼承CoroutineScope中的內(nèi)容,但是如果指定了Dispatchers.Main或者其他的Dispatchers.IO 這里不存在【單例】或者是【復(fù)用】機(jī)制,會重新創(chuàng)建一個Dispacthers的實(shí)例。


Coroutine 學(xué)習(xí)(二)ViewModelScope LifeCycleScope Dispatcher的評論 (共 條)

分享到微博請遵守國家法律
防城港市| 修文县| 柘荣县| 尚志市| 旬邑县| 马尔康县| 榆中县| 宁南县| 闽侯县| 镇康县| 龙游县| 分宜县| 肇庆市| 秦皇岛市| 天峻县| 阿克| 达日县| 榆林市| 民县| 尼勒克县| 昌都县| 布尔津县| 万全县| 武汉市| 晋中市| 赤水市| 延川县| 芜湖县| 黄骅市| 阳泉市| 庆城县| 湘潭县| 正宁县| 贡觉县| 日喀则市| 磐石市| 芦溪县| 石河子市| 柞水县| 高安市| 乌兰察布市|