Android 如何在 Dispatchers.Default 上的 viewModel 中执行 flow.map()
Android How to execute flow.map() in viewModel on Dispatchers.Default
我正在开发一个 Android 应用程序,使用 MVVM 设计模式。
所以,我有一个向 ViewModel 公开 flow<T>
的存储库。然后,ViewModel 根据以下代码使用 asLiveData()
将 flow<T>
转换为 LiveData<T>
。
repository.getFlow().map {
// I will do some long running work here
}.asLiveData()
如您所见,我将在 map { }
中完成一些长期 运行 的工作。所以我想在Dispatchers.Default
线程中执行map { }
里面的代码。
根据我的研究,我可以按照下面的代码使用 flowOn(Dispatchers.Default)
或 asLiveData(viewmodelScope.coroutineContext + Dispatchers.Default)
。
- 地图{}与
flowOn(Dispatchers.Default)
repository.getFlow().map {
// I will do some long running work here
}.flowOn(Dispatchers.Default).asLiveData()
- 地图{}与
asLiveData(viewmodelScope.coroutineContext + Dispatchers.Default)
repository.getFlow().map {
// I will do some long running work here
}.asLiveData(viewmodelScope.coroutineContext + Dispatchers.Default)
我想更好地了解协程上下文、作用域和 flowOn()。所以我的问题如下
1-1。 asLiveData(viewmodelScope.coroutineContext + Dispatchers.Default)
是否意味着 asLiveData()
函数将在 viewmodelScope
中与 Dispatchers.Default
的新协程中执行?
1-2。所以,然后 map {}
函数在新的 coroutine
和 Dispatchers.Default
中执行,因为流的中间运算符在消费者的协程中执行?
- 我还读到
flowOn(Dispatchers.Default)
在 flowOn()
函数中定义的 CoroutineContext 中执行上游流,这意味着 map{} 将在 Dispatchers.Default
线程中执行。在带有 asLiveData()
的视图模型中使用 flowOn() 可以吗?
谢谢大家
- 不确定我是否理解这个问题,但基本上这意味着流收集将在传递的协程上下文(
viewmodelScope
+ bg 线程)上发生,并且该值将从 bg 线程传播到 livedata .但是传播(emit()
调用)将始终切换到主调度程序。
- 是的,当您使用
flowOn()
时,所有上游运算符(您的 map
)都在定义的调度程序上 运行,直到出现新的 flowOn()
运算符。是的,可以与 asLiveData()
. 结合使用
这两个选项应该是等价的;我的目标是清晰明了,flowOn()
用法似乎更好地涵盖了这一点。
我正在开发一个 Android 应用程序,使用 MVVM 设计模式。
所以,我有一个向 ViewModel 公开 flow<T>
的存储库。然后,ViewModel 根据以下代码使用 asLiveData()
将 flow<T>
转换为 LiveData<T>
。
repository.getFlow().map {
// I will do some long running work here
}.asLiveData()
如您所见,我将在 map { }
中完成一些长期 运行 的工作。所以我想在Dispatchers.Default
线程中执行map { }
里面的代码。
根据我的研究,我可以按照下面的代码使用 flowOn(Dispatchers.Default)
或 asLiveData(viewmodelScope.coroutineContext + Dispatchers.Default)
。
- 地图{}与
flowOn(Dispatchers.Default)
repository.getFlow().map {
// I will do some long running work here
}.flowOn(Dispatchers.Default).asLiveData()
- 地图{}与
asLiveData(viewmodelScope.coroutineContext + Dispatchers.Default)
repository.getFlow().map {
// I will do some long running work here
}.asLiveData(viewmodelScope.coroutineContext + Dispatchers.Default)
我想更好地了解协程上下文、作用域和 flowOn()。所以我的问题如下
1-1。 asLiveData(viewmodelScope.coroutineContext + Dispatchers.Default)
是否意味着 asLiveData()
函数将在 viewmodelScope
中与 Dispatchers.Default
的新协程中执行?
1-2。所以,然后 map {}
函数在新的 coroutine
和 Dispatchers.Default
中执行,因为流的中间运算符在消费者的协程中执行?
- 我还读到
flowOn(Dispatchers.Default)
在flowOn()
函数中定义的 CoroutineContext 中执行上游流,这意味着 map{} 将在Dispatchers.Default
线程中执行。在带有asLiveData()
的视图模型中使用 flowOn() 可以吗?
谢谢大家
- 不确定我是否理解这个问题,但基本上这意味着流收集将在传递的协程上下文(
viewmodelScope
+ bg 线程)上发生,并且该值将从 bg 线程传播到 livedata .但是传播(emit()
调用)将始终切换到主调度程序。 - 是的,当您使用
flowOn()
时,所有上游运算符(您的map
)都在定义的调度程序上 运行,直到出现新的flowOn()
运算符。是的,可以与asLiveData()
. 结合使用
这两个选项应该是等价的;我的目标是清晰明了,flowOn()
用法似乎更好地涵盖了这一点。