[英]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.