在使用 Retrofit 和 Room 时,是否需要提及协程调度程序?

Do I need to mention the coroutine dispatcher while working with Retrofit and Room?

最近我看到这个 - Most data sources already provide main-safe APIs like the suspend method calls provided by Room or Retrofit. Your repository can take advantage of these APIs when they are available.

这是什么意思? Retrofit 和 Room 的调度程序是否在后台 Dispatcher.IO?还是我需要在提出请求时明确提及这一点?谢谢。

withContext(Dispatchers.IO) {
    // Some retrofit call or room query
}

不,调用 Retrofit 和 Room 的 suspend 函数时不需要切换上下文。我不确定他们是否在幕后使用 Dispatcher.IO,也许他们使用由线程池组成的自定义上下文,但保证在后台线程中调用它。

例如,您可以在 ViewModel class 中调用 suspend Dao 函数,如下所示:

viewModelScope.launch {
    val user dao.getCurrentUser()
    // Update UI using user
}

假设 getCurrentUser() 是一个 suspend 函数:

suspend fun getCurrentUser(): User

不,您不需要提及 Retrofit 和 Room 的调度程序。对于 Room,当你将一个 dao 函数标记为 suspend fun 时,它保证它不会阻塞主线程。

你可以阅读这篇文章https://medium.com/androiddevelopers/room-coroutines-422b786dc4c5

来自文章

Room calls the CoroutinesRoom.execute suspend function, which switches to a background dispatcher, depending on whether the database is opened and we are in a transaction or not.