【问题标题】:Kotlin: Coroutine with Live Data or only Coroutines?Kotlin:带有实时数据的协程还是只有协程?
【发布时间】:2019-04-29 23:10:43
【问题描述】:

这两者哪个更好

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

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

另一个问题

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

【问题讨论】:

    标签: android kotlin android-livedata kotlinx.coroutines


    【解决方案1】:

    我投票支持 (1),使用 LiveData 将数据从 ViewModel 移动到视图的最后一步。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-18
      • 2019-11-28
      • 2020-12-29
      • 2018-04-13
      • 1970-01-01
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多