当 LiveData 被赋予空值时应用程序挂起
App hangs when LiveData is assigned null value
我有一个名为 navigationArgs 的 LiveData:
private val _navigationArgs = MutableLiveData<Item>()
val navigationArgs: LiveData<Item>; get() = _navigationArgs
其中存储要传递给下一个片段的参数。它附加到观察者,以便在值更改时导航:
viewModel.navigationArgs.observe(this, Observer{
//navigation code
viewModel.finishedNavigating()
})
其中finishedNavigating()中_navigationArgs的值设置为null:
fun finishedNavigating(){
_navigationArgs.value = null
}
当 finishedNavigating()
包含在观察者中时,当 _navigationArgs
值更改时,应用程序甚至没有导航就挂起。
为什么会这样?我正在使用 Android Studio 4.0 Canary。谢谢。
嗯,它看起来像是一个无限循环的值发送给观察者,每次你设置一个值 null 发送然后一次又一次。
当你给 _navigationArgs.value
赋值时,代码会在 Observer 中自动调用,在 viewModel.navigationArgs.observe
中使用(navigationArgs
和 _navigationArgs
是相同的对象,因为 navigationArgs
有 getter, 即 returns _navigationArgs
).
在您的情况下,您将 null
分配给 finishedNavigating()
中的 _navigationArgs.value
,它调用 Observer
中的代码,它再次调用 finishedNavigating()
等等...
这里只是递归而已。
您应该添加递归退出条件。例如:
viewModel.navigationArgs.observe(this, Observer{
//navigation code
if (it != null) //don't call finishedNavigating, when null passed in to _navigationArgs.value
viewModel.finishedNavigating()
})
我有一个名为 navigationArgs 的 LiveData:
private val _navigationArgs = MutableLiveData<Item>()
val navigationArgs: LiveData<Item>; get() = _navigationArgs
其中存储要传递给下一个片段的参数。它附加到观察者,以便在值更改时导航:
viewModel.navigationArgs.observe(this, Observer{
//navigation code
viewModel.finishedNavigating()
})
其中finishedNavigating()中_navigationArgs的值设置为null:
fun finishedNavigating(){
_navigationArgs.value = null
}
当 finishedNavigating()
包含在观察者中时,当 _navigationArgs
值更改时,应用程序甚至没有导航就挂起。
为什么会这样?我正在使用 Android Studio 4.0 Canary。谢谢。
嗯,它看起来像是一个无限循环的值发送给观察者,每次你设置一个值 null 发送然后一次又一次。
当你给 _navigationArgs.value
赋值时,代码会在 Observer 中自动调用,在 viewModel.navigationArgs.observe
中使用(navigationArgs
和 _navigationArgs
是相同的对象,因为 navigationArgs
有 getter, 即 returns _navigationArgs
).
在您的情况下,您将 null
分配给 finishedNavigating()
中的 _navigationArgs.value
,它调用 Observer
中的代码,它再次调用 finishedNavigating()
等等...
这里只是递归而已。
您应该添加递归退出条件。例如:
viewModel.navigationArgs.observe(this, Observer{
//navigation code
if (it != null) //don't call finishedNavigating, when null passed in to _navigationArgs.value
viewModel.finishedNavigating()
})