android - 当 LiveData 被赋予空值时应用程序挂起

标签 android kotlin android-room android-livedata

我有一个名为 navigationArgs 的 LiveData:

private val _navigationArgs = MutableLiveData<Item>()
val navigationArgs: LiveData<Item>; get() = _navigationArgs

存储要传递给下一个 fragment 的参数。它附加到观察者,以便在值更改时进行导航:

viewModel.navigationArgs.observe(this, Observer{
 //navigation code
 viewModel.finishedNavigating()
})

其中finishedNavigating()中_navigationArgs的值设置为null:

fun finishedNavigating(){
 _navigationArgs.value = null
}

finishedNavigating() 包含在观察者中时,当 _navigationArgs 值更改时,应用程序甚至没有导航就挂起。

为什么会这样?我正在使用 Android Studio 4.0 Canary。谢谢。

最佳答案

当你给 _navigationArgs.value 赋值时,Observer 会自动调用 viewModel.navigationArgs.observe 中使用的代码(navigationArgs_navigationArgs 是相同的对象,因为 navigationArgs 有 getter,返回 _navigationArgs

在您的情况下,您在 finishedNavigating() 中将 null 分配给 _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()
})

关于android - 当 LiveData 被赋予空值时应用程序挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59014613/

相关文章:

android - 为什么应用程序在启动进度对话框时抛出异常抛出应用程序

android - 如何为 android 制作 instagram 操作栏样式?

android - 将 androidx.fragment.app.Fragment 转换为 android.app.fragment.Fragment?

android - 使用 Twilio JavaI420Buffer (Kotlin) 时出现 UnsatisfiedLinkError

java - 为什么我们要从存储库返回实时数据? (MVVM 安卓)

java - 如何在 Android map 中显示不同颜色的图钉?

android - 如何使用Kotlin的自定义适配器为 ListView 设置onItemClickListener

android - 尽管 autoGenerate=true,但主键的房间唯一约束失败

android - 房间迁移 : "no such table: room_table_modification_log"

java - 如何使用Android Room存储数据记录