在使用 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.
最近我看到这个 - 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.