gpt4 book ai didi

android - Kotlin:带实时数据的协程还是只有协程?

转载 作者:太空宇宙 更新时间:2023-11-03 12:14:01 25 4
gpt4 key购买 nike

这两个哪个好

1) 在 Viewmodel 中使用协程从网络获取数据并使用实时数据更新 View?

2)使用 View 中的协程调用 View 模型中从网络获取数据的挂起函数?

另一个问题

我们是否应该在只需要从后端更新 UI 一次的用例中使用实时数据,比如当用户在该屏幕上时数据不会更改

最佳答案

我投票赞成 (1),在将数据从 ViewModel 移动到 View 的最后一步中使用 LiveData

原因如下:如果您在 UI 中启动协程,它通过您的 ViewModel 获取数据...

  1. 您最终会在 View 中执行类似 getData() 的暂停调用。无论是 Fragment 还是 Activity,协程都只会将结果传递给特定的实例。如果由于配置更改而重新创建,您将需要在新实例中再次获取。
  2. 如果您正在处理协程的取消(您可能应该这样做),配置更改将意味着您已经在 ViewModel 和网络中完成的所有工作都将丢失(例如,长时间运行的网络调用的任何进展),因为当您的 View 被销毁时,您的协程将被取消。
  3. 如果您在 View 被销毁时没有取消协程,您的数据获取函数可能会尝试更新 View 中的用户界面,如果 View 完成,则该 View 不再存在。

相比之下,如果您在 ViewModel 中启动协程,然后将结果放在 LiveData 中:

  1. 由于 ViewModel 的使用生命周期更长,您的提取可以在配置更改时继续。
  2. 您可以在屏幕永久关闭时(在 onCleared 中)而不是在配置更改时取消协程。
  3. LiveData 观察者只会在 View 存在并处于 Activity (前台)状态时被调用,因此您不必担心在 View 尚未准备好时获取结果(或不再存在)。
  4. 当您的 View 重新创建时,新实例可以开始观察 LiveData 并接收已加载的值。或者,如果您的数据仍在加载,它甚至最终会收到为之前的 View 实例启动的网络调用的结果。

关于android - Kotlin:带实时数据的协程还是只有协程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53512752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com