【问题标题】:Should i always use viewmodescope when network request?网络请求时我应该始终使用 viewmodescope 吗?
【发布时间】:2021-01-03 12:09:08
【问题描述】:

https://medium.com/androiddevelopers/coroutines-patterns-for-work-that-shouldnt-be-cancelled-e26c40f142ad 中说“ViewModel/Presenter 层应该创建协程”
然后我只能使用 livedata 将结果通知给 Activity/Framgent。 我想知道一个只返回成功/失败的简单请求,例如注册、添加或提交,我是否还必须在 Activity 中使用 livedata
vm.request().observe(this, 观察{
成功->
失败->
})
或者我可以通过 lifeCycleScope 在 Activity 中创建协程而无需回调
启动{
val ret = vm.request()
如果(ret.isSuccess){
}
}

【问题讨论】:

  • 这取决于你需要什么。没有人强迫您使用 LiveData。以下是一些关于 LiveData 的文档:The advantages of using LiveData。您可以自行决定 LiveData 是否对您有用。

标签: android viewmodel android-livedata kotlin-coroutines


【解决方案1】:

使用 Live Data 和 ViewModel 的原因是构建代码并编写可测试(编写单元测试用例)代码。根据 MVMM 模式,我们不应该在视图中包含任何业务逻辑。所以我们将逻辑移到了 ViewModel 中。 ViewModel 应该将信息发送给查看,以便我们使用 LiveData。

使用 viewModelScope 的原因,我们正在执行我们调用的长时间运行操作(需要 5 秒从服务器获取数据的 API 调用)。那时用户点击后退按钮熄灭。我们需要手动取消 API 调用。 (如果我们不取消可能会导致Memory leak 问题) 如果我们使用viewModelScope 将取消取消部分。

viewModelScope.launch {
  // call api 
  // update the LiveData
}

如果不使用viewModelScope,我们也可以使用GlobalScope 长时间运行的进程执行此操作,直到应用程序上线(不是首选https://elizarov.medium.com/the-reason-to-avoid-globalscope-835337445abc)。

【讨论】:

    猜你喜欢
    • 2014-08-08
    • 2020-12-27
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多