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)

  1. 地图{}与 flowOn(Dispatchers.Default)
repository.getFlow().map {
   // I will do some long running work here
}.flowOn(Dispatchers.Default).asLiveData()
  1. 地图{}与 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 {} 函数在新的 coroutineDispatchers.Default 中执行,因为流的中间运算符在消费者的协程中执行?

  1. 我还读到 flowOn(Dispatchers.Default)flowOn() 函数中定义的 CoroutineContext 中执行上游流,这意味着 map{} 将在 Dispatchers.Default 线程中执行。在带有 asLiveData() 的视图模型中使用 flowOn() 可以吗?

谢谢大家

  1. 不确定我是否理解这个问题,但基本上这意味着流收集将在传递的协程上下文(viewmodelScope + bg 线程)上发生,并且该值将从 bg 线程传播到 livedata .但是传播(emit() 调用)将始终切换到主调度程序。
  2. 是的,当您使用 flowOn() 时,所有上游运算符(您的 map)都在定义的调度程序上 运行,直到出现新的 flowOn() 运算符。是的,可以与 asLiveData().
  3. 结合使用

这两个选项应该是等价的;我的目标是清晰明了,flowOn() 用法似乎更好地涵盖了这一点。