Mah*_*zad 5 android kotlin android-viewmodel kotlin-coroutines coroutinescope
是在 ViewModel 中启动协程更好,还是用suspend修饰符标记 ViewModel 函数并在 Activity/fragment 本身中启动协程更好?
在 ViewModel 中启动:
class MainViewModel: ViewModel() {
fun addNewItem(item: Item) {
viewModelScope.launch {
// Add the item to database
}
}
}
Run Code Online (Sandbox Code Playgroud)
class ItemsFragment: Fragment() {
fun onButtonClick() {
viewModel.addNewItem(Item())
}
}
Run Code Online (Sandbox Code Playgroud)
在 LifeCycleOwner 中启动:
class MainViewModel: ViewModel() {
suspend fun addNewItem(item: Item) {
// Add the item to database
}
}
Run Code Online (Sandbox Code Playgroud)
class ItemsFragment: Fragment() {
fun onButtonClick() {
lifecycleScope.launchWhenStarted {
viewModel.addNewItem(Item())
}
}
}
Run Code Online (Sandbox Code Playgroud)
这实际上取决于您的用例以及您是否想将任务绑定到viewModelScope或视图的lifecycleScope.
为了更好地理解,请考虑以下两个示例:
lifecycleScope,因为在方向更改的情况下,您的任务将被终止,并且您必须再次重新启动数据获取。一般来说,我认为您更有可能遇到第一种情况。
在您的情况下,添加项目进入第一个用例,因为假设您直接从视图启动并使用lifecycleScopefrom Fragment/Actvity,在这种情况下,如果suspend保存仍在运行并且发生方向更改,则任务将被终止并且您的用户会想知道为什么没有添加该项目。
话虽如此,数据库操作通常运行得如此之快,以至于上述场景很难重现,但为了测试目的而抛出 api 请求或延迟,您可以检查一下理论。
| 归档时间: |
|
| 查看次数: |
1607 次 |
| 最近记录: |