簡體   English   中英

Retrofit 調用 Kotlin 協程 viewModelScope

[英]Retrofit call in Kotlin Coroutines viewModelScope

最近我更新了我的ViewModel以使用新的viewModelScope 從它的實現中,我看到Dispatchers.Main.immediate被設置為viewModelScope CoroutineDispatcher

因此,當在viewModelScope.launch中打印當前Thread時,它會給出Thread[main,5,main]

但這是我的問題。 雖然這在主線程中運行,但以下代碼對我有效,它執行網絡調用。

viewModelScope.launch {
    userRepo.login(email, password)
}

這里userRepo.login(email, password)suspend function,它調用Retrofit suspend

那么,如果我的當前線程是主線程,這是如何工作的?

它之所以有效,是因為 Retrofit 的suspend實現委托給Call<T>.enqueue 這意味着默認情況下它已經在自己的后台執行程序上執行,而不是使用調用者的Dispatcher

從主線程調用掛起函數總是安全的。 但是,如果您要執行繁重的操作,例如從服務器、數據庫、內容加載器中獲取數據……最好使用適當的調度程序,例如 Dispatcher.IO。

如果您願意,可以將此調度程序與 viewmodelScope 一起使用,然后所有掛起函數都使用此調度程序運行。

現在 ViewModel 是一個 Executor(一個 class 將執行從 Main 更改為 background)

如果要更改 ViewModel 中的調度程序,一個好的做法是通過構造函數注入此 Dispatcher 來測試 ViewModel。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM