【问题标题】:Observe live data objects in fragment using activity context?使用活动上下文观察片段中的实时数据对象?
【发布时间】:2019-09-08 22:24:37
【问题描述】:

我正在使用导航底部和共享ViewModel 与导航底部内的所有片段,但它在第二次调用片段时抛出此异常

java.lang.IllegalArgumentException: Cannot add the same observer with different lifecycles

我试图让所有观察者都附加到活动而不是它的片段,如下所示

1-在fragemt中声明viewModel

viewModel = activity?.run { 
          ViewModelProviders.of(this,viewModelFactory).get(SharedViewModel::class.java)
} ?: throw Exception("Invalid Activity")

2-Observer livedata 对象

viewModel.msg.observe(activity!!, Observer {
     Log.i(TAG,it)
})

3- 移除观察者

override fun onStop() {
    super.onStop()
    viewModel.msg.removeObservers(activity!!)
}

这段代码对我来说工作正常,但我想知道我的代码是否正确并且可能工作? 提前致谢

【问题讨论】:

  • 您应该使用片段生命周期观察 livedata,您仍然拥有共享的 ViewModel 对象,因为您已经从活动中获取它,但您不需要手动删除观察者。如果您的片段正在分离/重新连接,您可以考虑改用viewLifecycleOwner
  • 尽量不要在 onStop() 中移除观察者。

标签: android kotlin android-livedata android-viewmodel


【解决方案1】:

这是我们在片段中使用实时数据时常犯的错误。在片段上使用this/activity 可以重复。您应该使用viewLifecycleOwner 在片段中进行实时数据观察。

viewModel.msg.observe(viewLifecycleOwner, Observer {
            Log.i(TAG,it)
        })

欲了解更多信息,请阅读本文https://medium.com/@cs.ibrahimyilmaz/viewlifecycleowner-vs-this-a8259800367b

您无需手动移除观察者。

【讨论】:

  • 使用 viewLifecycleOwner :在记录它的值后,我得到了 Failure(isNetWorkError=false, errorCode=null, errorBody=null) 但 Http 客户端记录了正确的响应 200 Ok 。不知道哪里出错了?任何建议
  • ViewLifecycleOwner 不应妨碍您的回复。请重新检查您的用例。任何回退或异常都可能引发失败。
【解决方案2】:

为什么要将观察者添加到具有活动生命周期的片段中?如果您有一些逻辑需要在片段不活动时执行,请将其添加到您的活动中。因此,您需要的是:

viewModel.msg.observe(this, Observer {
    Log.i(TAG, it)
})

在您的情况下,每次重新打开片段时,都会附加一个具有相同生命周期的新观察者,这似乎是一个错误。 Livedata 观察者是专门设计的,因此您不必编写代码来手动处理生命周期。

【讨论】:

  • 好的,但是它会抛出这个异常 java.lang.IllegalArgumentException: 无法添加具有不同生命周期的相同观察者我该怎么办?
猜你喜欢
  • 2019-08-04
  • 2021-07-28
  • 2020-06-05
  • 1970-01-01
  • 2020-08-14
  • 2017-06-22
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
相关资源
最近更新 更多