当 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()
})